Я работаю над приложением меню MacOS, которое блокирует любые события мыши. Я пытаюсь добиться того, чтобы после отправки событий мыши в обратный вызов на основе CGEventRef я не мог нигде щелкнуть (естественно), но проблема в том, что из-за этого я не могу выйти из цикла.
Каждый раз, когда мне нужно закрыть его, я переключаюсь на приложение Xcode, чтобы остановить работающее приложение.
Это основная функция и события, которые я отправляю в функцию обратного вызова;
void lockTrackpad(void) {
// For keyboard inputs, I add CGEventMaskBit(kCGEventKeyUp)| CGEventMaskBit(kCGEventKeyDown)| CGEventMaskBit(NX_SYSDEFINED)
CGEventMask mask = (
CGEventMaskBit(kCGEventMouseMoved)
| CGEventMaskBit(kCGEventLeftMouseUp)
| CGEventMaskBit(kCGEventLeftMouseDown)
| CGEventMaskBit(kCGEventRightMouseUp)
| CGEventMaskBit(kCGEventRightMouseDown)
| CGEventMaskBit(kCGEventScrollWheel)
);
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, mask, CGEventCallback_r, nil);
...
}
И это функция обратного вызова;
CGEventRef CGEventCallback_r(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
CGKeyCode keycode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
printf("Event Tap: %d\n", keycode);
if (keycode == 43) {
printf("quit the application \n");
exit(EXIT_SUCCESS);
}
return nil;
}
Я хочу, например, когда цикл работает, если нажать «control + U + L», я хочу запустить какую-то функцию для выхода из цикла. Я считаю, что для получения ввода с клавиатуры я также должен отправлять события клавиатуры, но я не мог понять, как определить мои сочетания клавиш.
Я хочу сделать что-то вроде этого;
CGEventRef CGEventCallback_r(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
CGKeyCode keycode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
// When pressing "control + U + L", call a function
if (...) {
printf("pressed control + U + L \n");
doSomething();
}
return nil;
}
Я добавил биты клавиатуры в маску, названную CGEventCallback_r для событий клавиатуры, и приложение изолировано. Я получаю коды клавиш для событий клавиатуры. Например, вопрос, как я определяю нажатие «control + U + L» на CGEventCallback_r.
Вы можете проверить управление с помощью CGEventGetFlags. Какие события вы получаете, когда нажимаете «control + U + L»? Может быть, попробовать какие-то другие функции Quartz Event Services, например CGEventSourceKeyState?
Я получаю коды ключей для них. Но не знаю, как определить, нажаты ли 3 из них или нет.
Вы пытались установить флаг, когда клавиша поднимается или опускается? Вы пробовали проверять состояния?





Я понял так;
CGEventRef CGEventCallback_r(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyDown) {
CGKeyCode keyCode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
if (CGEventGetFlags(event) & kCGEventFlagMaskControl) {
// control key is pressed
controlKeyPressed = true;
}
if (keyCode == kVK_ANSI_U) {
// u key is pressed
uKeyPressed = true;
}
if (keyCode == kVK_ANSI_L) {
// l key is pressed
lKeyPressed = true;
}
if (controlKeyPressed && uKeyPressed && lKeyPressed) {
// doSomething();
}
return event;
} else if (type == kCGEventKeyUp) {
CGKeyCode keyCode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
// set the variable to false just like above.
}
if (keycode == 43) {
printf("quit the application \n");
exit(EXIT_SUCCESS);
}
return nil;
}
Кроме того, не забудьте поместить свои переменные в глобальную область видимости.
Вы добавили биты клавиатуры в маску?
CGEventCallback_rвызывается для событий клавиатуры? Какова ценностьkeycode? Приложение находится в песочнице? Возникает вопрос, как обнаружить клавишу Control?