2009-11-30 137 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