我有一个全局应用程序,可防止鼠标移动到屏幕区域。必须适用于所有应用,而我的应用在后台等等。
我已经设置了一个CGEventTap
钩子,它有一个鼠标移动回调。
无论我如何尝试修改/杀死机芯,用户的鼠标移动都会继续通过挂钩。这反映了其他人的经历:https://stackoverflow.com/a/5831573/106761
- (CGEventRef) mouseMovedEvent:(CGEventRef) newUserMouseMovement
{
//Attempt to modify the mouse movement
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0);
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaY, 0);
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0.0);
//Attempt to kill the event
return NULL;
}
//Mouse movement still works normally.
我我能够使用CGDisplayMoveCursorToPoint
或CGWarpMouseCursorPosition
将光标重新定位回原始位置。
这很好用,但我宁愿完全杀掉这个事件。
问题是,在我能够移动光标之前,原始用户鼠标移动在该点显示光标可视一瞬间。
我正在使用:
CGSetLocalEventsSuppressionInterval(0.0);
增加鼠标移动的频率。但这也使得真实的"光标,在我移动之前,闪光在"禁区"如果用户将鼠标放在我不希望鼠标移动的区域。
我可能会使用:Globally hiding cursor (from background app)但我怀疑Mac App Store是合法的。
有什么想法吗?
编辑:如何创建事件点击:
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
...
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type == kCGEventMouseMoved) {
event = [refToSelf mouseMovedEvent:event];
}
...
return event;
}
答案 0 :(得分:2)
您正尝试修改kCGHIDEventTap
location上的事件,
指定在HID系统事件进入窗口服务器的位置放置事件点击。
不幸的是,CGEventTapCreate()
doc说:
只有以root用户身份运行的进程才能在HID事件进入窗口服务器的位置找到事件点击;对于其他用户,此函数返回
NULL
。
我怀疑这与你的难度密切相关,尽管文档似乎与正在发生的事情(他们已经超过四年)不符。
也许您可以将此功能转移到具有超级用户权限的单独进程中,让您的应用程序的其余部分保持正常用户模式?我相信还有一种方法可以为您的程序采取的特定操作请求root权限。