【发布时间】:2012-04-11 13:47:11
【问题描述】:
我有一个全局应用程序可以防止鼠标移动到屏幕区域。必须适用于所有应用程序,而我的应用程序在后台等。
我已经设置了一个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);
增加鼠标移动触发的频率。但这也会使“真正的”光标在我移动它之前,flash 在“禁止区域”中,如果用户将鼠标放在我不希望鼠标移动的区域上。
我可能会使用: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;
}
【问题讨论】:
-
你能显示你在创建水龙头时传递的参数吗?
-
是的,错过了...现在添加。
-
太棒了!现在,这个进程是否以 root 身份运行?您不能在 HID->window 服务器连接处修改事件,除非以 root 身份修改。
-
我认为如果应用程序旨在分发,尤其是通过 Mac App Store,我不会以 root 身份运行...真的吗?如果它不是别人可以使用的东西,我们就不要走这条路。
-
不幸的是,这是您的第 22 条军规。您无法实现这一点,除非您的进程以 root 身份运行,并且您的进程无法以 root 身份运行,因为 App Store 不允许这样做。
标签: objective-c macos cocoa macos-carbon