2009-09-27 15 views
15

Tôi đang sử dụng đoạn mã sau để mô phỏng một cú nhấp chuột:Performing một nhấp chuột kép sử dụng CGEventCreateMouseEvent()

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); 
} 

tôi có thể sử dụng cơ bản cùng mã để làm một điều khiển nhấp chuột (click chuột phải) bằng cách thay đổi:

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

012.

cho các sự kiện "Đúng" tương ứng. Hàm trông giống như sau:

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

Nhưng, cách nhấp đúp? Tôi đã thử gửi 2 nhấp chuột trái và gọi PostMouseEvent() hai lần liên tiếp nhưng không may mắn. Làm cách nào để bạn thực hiện nhấp đúp?

cảm ơn!

Trả lời

16

Nhìn vào CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount). Ngoài ra, ngay cả sau khi đặt clickCount thành 2, bạn có thể phải thực hiện 2 sự kiện trong một số trường hợp, cho các ứng dụng cũ.

Vì vậy, về cơ bản:

  1. Tạo sự kiện
  2. Set nhấp chuột đếm đến 2
  3. Set loại sự kiện để MouseDown và gửi
  4. Set loại sự kiện để MouseUp và gửi
  5. Lặp lại 3 và 4

Chỉnh sửa:

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); 
} 
+0

như: CGEventSetIntegerValueField (kCGMouseButtonLeft, kCGEventLeftMouseDown, 2) tôi có cần đặt lại thành 1 sau đó không? – Uri

+1

Bạn cần chuyển tham chiếu đến đối tượng sự kiện thực tế, trong trường hợp của bạn là "theEvent", làm tham số đầu tiên. Tại thời điểm đó, số lần nhấp của sự kiện đó được đặt thành 2 và bạn muốn để nó là 2 cho tất cả 4 CGEventPost mà bạn cần thực hiện (xuống, lên, xuống, lên). – phoebus

+0

như thế này: CGEventSetIntegerValueField (kCGEventLeftMouseDown, kCGMouseEventClickState, 2); Tôi nhận được một số cảnh báo ... bạn có thể đăng một đoạn mã không? cảm ơn! – Uri

3

Đây là mã mẫu để mô phỏng nhấp đúp.

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); 

Lưu ý rằng CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2); sẽ theo sau tập đầu tiên của số lần nhấp chuột lên, lên.

Các vấn đề liên quan