Я пытаюсь добавить ловушку событий, чтобы включить / отключить событие с моего волшебного трекпада.Я думал, что это будет прямо вперед, то есть зарегистрировать ловушку события и, при необходимости, отменить событие, возвращая NULL
.Идея состоит в том, чтобы использовать панель для какого-то конкретного, трудоемкого ввода данных, приложения для ввода данных являются сторонними, поэтому я не могу просто добавить код, который я хочу, там, где я хочу.Поэтому я решил, что я буду отслеживать системные события, а затем отправлять желаемые данные через группу CGEventCreateKeyboardEvent
s.
. Проблема с возвратом нулевого значения, по-видимому, не отбрасывает события, более подробное исследование предполагает, чтоэто относится не только к тем, кто приходит с трекпада, но и к моей 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 not enabled» не выводится, хотя я не думаю, что опция доступности влияет на что-либо, кроме событий клавиатуры.
Кстати, я видел несколько похожих постов о том, как получить события с сенсорной панели, просто ничего не применимо к их удалению (кроме возврата нуля должно работать).