18

我正在使用以下代码来模拟鼠标点击:

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 LeftClick(const CGPoint point) 
{
 PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point);
 NSLog(@"Click!");
 PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point);
 PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, point);
}

我可以使用基本相同的代码通过更改进行控制单击(右键单击):

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

到他们各自的“权利”事件。该函数看起来像:

void RightClick(const CGPoint point) 
{
 PostMouseEvent(kCGMouseButtonRight, kCGEventMouseMoved, point);
 NSLog(@"Click Right");
 PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseDown, point);
 PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseUp, point);
}

但是,双击呢?我尝试发送 2 次左键单击并连续两次调用 PostMouseEvent() 但没有运气。如何执行双击?

谢谢!

4

2 回答 2

18

调查CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount)。此外,即使将 clickCount 设置为 2,在某些情况下,对于旧版应用程序,您也可能需要执行 2 个事件。

所以基本上:

  1. 创建活动
  2. 将点击次数设置为 2
  3. 将事件类型设置为 mousedown 并发送
  4. 将事件类型设置为 mouseup 并发送
  5. 重复 3 和 4

编辑:

void doubleClick(int clickCount) {
    CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, kCGMouseButtonLeft);  
    CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, clickCount);  
    CGEventPost(kCGHIDEventTap, theEvent);  
    CGEventSetType(theEvent, kCGEventLeftMouseUp);  
    CGEventPost(kCGHIDEventTap, theEvent);  
    CGEventSetType(theEvent, kCGEventLeftMouseDown);  
    CGEventPost(kCGHIDEventTap, theEvent);  
    CGEventSetType(theEvent, kCGEventLeftMouseUp); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CFRelease(theEvent); 
}
于 2009-09-27T14:19:52.730 回答
4

这是模拟双击的示例代码。

CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(x, y), kCGMouseButtonLeft);  
CGEventPost(kCGHIDEventTap, theEvent);  
CGEventSetType(theEvent, kCGEventLeftMouseUp);  
CGEventPost(kCGHIDEventTap, theEvent);  

CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);

CGEventSetType(theEvent, kCGEventLeftMouseDown);  
CGEventPost(kCGHIDEventTap, theEvent);  

CGEventSetType(theEvent, kCGEventLeftMouseUp); 
CGEventPost(kCGHIDEventTap, theEvent); 

CFRelease(theEvent); 

请注意,CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);在第一组向下,向上点击之后。

于 2011-03-10T07:55:42.713 回答