我正在尝试添加一个事件陷阱来启用/禁用魔术触控板上的事件。我认为这应该很简单,即注册一个事件陷阱,当需要时通过返回
问题在于,返回null似乎不能丢弃事件,进一步调查表明,这不仅限于来自触控板的事件,还包括我的默认USB鼠标。
下面是我的代码。使用下面的代码,我希望无法移动鼠标,如果我将(A)更改为使用
请注意,“axapi未启用”不会输出,尽管我认为无障碍选项不会影响除键盘事件以外的任何内容。
顺便说一下,我看到了一些类似的帖子,介绍如何从触摸板获取事件,但没有适用于丢弃它们的(除了返回null应该可以起作用)。
NULL
来丢弃该事件。我的想法是将触控板用于一些特定的、耗时的数据输入,要输入数据的应用程序是第三方的,所以我不能只是添加代码来实现我想要的功能。因此,我想监视系统事件,然后通过一系列的CGEventCreateKeyboardEvent
发送所需的输入。问题在于,返回null似乎不能丢弃事件,进一步调查表明,这不仅限于来自触控板的事件,还包括我的默认USB鼠标。
下面是我的代码。使用下面的代码,我希望无法移动鼠标,如果我将(A)更改为使用
kCGEventScrollWheel
或kCGEventLeftMouseDragged
,则该事件被消耗,即滚动或左键拖动不会发生。这是否意味着并非所有事件都可以被丢弃?希望我只是漏了什么显而易见的东西。 #define case_print(a) case a: printf("%s - %d\n",#a,a); break;
CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
int subType = CGEventGetIntegerValueField(event, kCGMouseEventSubtype);
if (type == NSEventTypeGesture || subType == NX_SUBTYPE_MOUSE_TOUCH) {
printf("touchpad\n");
switch(type) {
case_print(kCGEventNull)
case_print(kCGEventLeftMouseDown)
case_print(kCGEventLeftMouseUp)
case_print(kCGEventRightMouseDown)
case_print(kCGEventRightMouseUp)
case_print(kCGEventMouseMoved)
case_print(kCGEventLeftMouseDragged)
case_print(kCGEventRightMouseDragged)
case_print(kCGEventScrollWheel)
case_print(kCGEventOtherMouseDown)
case_print(kCGEventOtherMouseUp)
case_print(kCGEventOtherMouseDragged)
case_print(kCGEventTapDisabledByTimeout)
case_print(kCGEventTapDisabledByUserInput)
case_print(NSEventTypeGesture)
case_print(NSEventTypeMagnify)
case_print(NSEventTypeSwipe)
case_print(NSEventTypeRotate)
case_print(NSEventTypeBeginGesture)
case_print(NSEventTypeEndGesture)
default:
printf("default: %d\n",type);
break;
}
event = NULL;
} else {
if (type == kCGEventMouseMoved) { // (A)
printf("discarding mouse event");
event = NULL;
}
}
return event;
}
CFMachPortRef createEventTap() {
CGEventMask eventMask = NSAnyEventMask;
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
printf("axapi not enabled");
}
return CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
eventMask,
eventOccurred,
NULL);
}
int main (int argc, const char * argv[]) {
CFMachPortRef tap = createEventTap();
if (tap) {
CFRunLoopSourceRef rl = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), rl, kCFRunLoopCommonModes);
CGEventTapEnable(tap, true);
CFRunLoopRun();
printf("Tap created.\n");
sleep(-1);
} else {
printf("failed!\n");
}
return 0;
}
请注意,“axapi未启用”不会输出,尽管我认为无障碍选项不会影响除键盘事件以外的任何内容。
顺便说一下,我看到了一些类似的帖子,介绍如何从触摸板获取事件,但没有适用于丢弃它们的(除了返回null应该可以起作用)。