我有一个全局应用程序,可以防止鼠标移动到屏幕区域。必须与所有应用程序一起工作,而我的应用程序在后台等
我已经设置了一个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);
以增加鼠标移动触发的频率。但这也使得"真正的"光标,在我移动它之前,在"禁区"中闪烁,如果用户将鼠标放在我不希望鼠标移动的区域上。
我可能会使用:全局隐藏光标(从后台应用程序),但我怀疑这是否合法。
有什么想法吗?
编辑:如何创建事件点击:
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;
}
您正试图修改kCGHIDEventTap
位置的事件,
指定在HID系统事件进入窗口服务器的位置放置一个事件抽头。
不幸的是,CGEventTapCreate()
文档说:
只有作为根用户运行的进程才能在HID事件进入窗口服务器的点处定位事件抽头;对于其他用户,此函数返回
NULL
。
我怀疑这与你的困难有很大关系,尽管医生们似乎与正在发生的事情不太相符(他们已经四岁多了)。
也许您可以将此功能拆分为一个具有超级用户权限的单独进程,使应用程序的其余部分处于正常用户模式?我相信还有一种方法可以为您的程序执行的特定操作请求root权限。