在Quartz应用程序中,我试图冻结屏幕上的鼠标pointer,但继续从用户注册鼠标mouvements。我发现了如何冻结指针的方法:
CGAssociateMouseAndMouseCursorPosition(false);
我正在跟踪documentation,但不知道如何获取和读取包含鼠标变化量(X和Y的变化)数据的事件。
我找到了解决方案。我现在得到这样的鼠标移动:
CGEventMask eventMask = CGEventMaskBit(kCGEventMouseMoved);
CFMachPortRef tap = CGEventTapCreate( kCGAnnotatedSessionEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly,
eventMask,
eventOccurred,
NULL);
CFRunLoopSourceRef rl = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), rl, kCFRunLoopCommonModes);
CGEventTapEnable(tap, true);
其中回调是:
CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
if (type == kCGEventMouseMoved) {
d_x = CGEventGetIntegerValueField(event, kCGMouseEventDeltaX);
d_y = CGEventGetIntegerValueField(event, kCGMouseEventDeltaY);
}
return event;
}
注意:d_x
和d_y
是全局定义的int
,用于存储每个事件之间的鼠标移动。