2009-11-30 132 views
5
對象

我一直在使用下面的代碼在Mac點擊鼠標向下拖動在Mac

void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point) 
{ 
    CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button); 
    CGEventSetType(theEvent, type); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CFRelease(theEvent); 
} 

void Click(const CGPoint point) 
{ 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
    NSLog(@"Click!"); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, point); 
} 

編程方式發出點擊現在,我試圖點擊要能拖對象,如滾動條或應用程序的窗口。我使用了以下內容:

PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
NSLog(@"Click Down!"); 
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 

,當我跑上面的一些有趣的事情會發生,當鼠標左鍵下來是沒有問題的代碼似乎發生,我將我的鼠標和窗口不動,但當我添加一個鼠標向上事件,然後窗口跳到我所謂的拖動它的位置。這是好的,但是,我怎樣才能使鼠標點擊並拖動一個對象?

注:我有一個整體的方法來看看,當鼠標停止移動這樣我就可以點擊了。

請發送郵編。 感謝

回答

3

做你想做的是設置一個活躍CGEventTap得到kCGEventMouseMoved事件的編輯流,並將它們變成kCGEventLeftMouseDragged事件在CGEventTap的回調是什麼(很明顯,你需要先合成鼠標按下事件)的唯一方法

你會認爲這是通過發送沒有釋放點擊事件和移動鼠標自動完成的,但事實並非如此。

+1

所以,嗯,像,你怎麼做,哈哈。 – 2012-02-04 12:16:20

+0

CGEventSetType(event,kCGEventLeftMouseDragged) – valexa 2012-02-12 17:55:12

3

要拖動,你必須把鼠標鍵,然後再移動鼠標。

以編程方式,您應該在LeftMouseDownLeftMouseUp事件之間發佈kCGEventLeftMouseDragged而不是kCGEventMouseMoved。您可以安裝自定義事件點擊並記錄真實的鼠標事件以確認或更正此問題。

+1

使用kCGEventLeftMouseDragged時我仍然看到相同的行爲。 任何機會,你可以給我一個片段?我確定我做錯了什麼。謝謝! – Uri 2009-11-30 03:42:12

+1

好的,我試圖用CGEventCreateMouseEvent()創建事件,但我仍然看到相同的行爲... – Uri 2009-11-30 03:51:22

+1

任何人?沒有人有答案? – Uri 2010-02-02 19:51:53

2

雖然在PyObjC,像廣告這樣做的工作。但是如果你願意的話,你可以反向工程回到Cocoa。

#!/usr/bin/python 
import sys, time 
from Quartz.CoreGraphics import * 

def mouseEvent(type, posx, posy): 
    theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft) 
    CGEventPost(kCGHIDEventTap, theEvent) 

def mousemove(posx,posy): 
    mouseEvent(kCGEventMouseMoved, posx,posy) 

def mouseclickdn(posx,posy): 
    mouseEvent(kCGEventLeftMouseDown, posx,posy) 

def mouseclickup(posx,posy): 
    mouseEvent(kCGEventLeftMouseUp, posx,posy) 

def mousedrag(posx,posy): 
    mouseEvent(kCGEventLeftMouseDragged, posx,posy) 

ourEvent = CGEventCreate(None) 
currentpos = CGEventGetLocation(ourEvent) # Save current mouse position 

mouseclickdn(60, 100) 
mousedrag(60, 300) 
mouseclickup(60, 300) 

time.sleep(1) 
mousemove(int(currentpos.x), int(currentpos.y)) # Restore mouse position 
1

我已經這樣重新實現它在可可在C:

void mouse_left_click_down_at(float x, float y) { 

      /** 
      * create a new Quartz mouse event. 
      * params: 
      * @source : CGEventSourceRef 
      * @mouseType : CGEventType 
      * @mouseCursorPosition : CGPoint 
      * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_down_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_down_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_down_event); 
    } 
    void mouse_left_click_up_at(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_up_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_up_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_up_event); 
    } 

    void mouse_left_drag_to(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_drag_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDragged, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_drag_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_drag_event); 
    } 

但我遇到一些問題,由一個執行它之一。我只在調用鼠標按下,鼠標拖動和鼠標移動之間添加一些顯着的延遲時才起作用。

mouse_left_click_at(400.0, 200.0);   // get focus 
    usleep(10000); 

    mouse_left_click_down_at(400.0, 200.0);  // start dragging 
    usleep(10000); 
    mouse_left_drag_to(500.0, 400.0);   // continue dragging 
    usleep(10000); 
    mouse_left_drag_to(600.0, 500.0); 
    usleep(10000); 
    mouse_left_drag_to(700.0, 600.0); 
    usleep(10000); 
    mouse_left_drag_to(800.0, 700.0); 
    usleep(10000); 
    mouse_left_click_up_at(800.0, 700.0);  // stop dragging