我試圖添加事件陷阱來啓用/禁用來自我的觸控板的事件。我認爲這會很簡單,即註冊一個事件陷阱,並在需要時通過返回NULL
來放棄該事件。這個想法是使用pad來處理一些特定的,耗時的數據輸入,輸入數據的應用程序是第三方的,所以我不能只是添加代碼來達到我想要的目的。所以我想我會監視系統事件,然後通過一堆CGEventCreateKeyboardEvent
s發送所需的輸入。使用事件觸發消耗OSX鼠標/觸控板事件
問題是返回null似乎沒有放棄事件,多一點調查表明,這不限於那些來自觸控板,但也是我的默認USB鼠標。
我的代碼如下。如果我改變(A)使用kCGEventScrollWheel
或kCGEventLeftMouseDragged
,那麼事件將被消耗,即滾動或左側btn拖動不會發生,因此我預計不能移動鼠標。這是否意味着並非所有事件都可以被丟棄?但願我只是缺少明顯的東西在這裏
#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應該工作)。
爲什麼這個標記爲答案嗎?你是否能夠阻止處理鼠標事件?我可以停止按鍵事件,但不能移動鼠標...... – cksubs 2012-03-23 22:29:40