CGEventPost - удерживать клавишу (сдвиг)

Я ищу способ создать небольшую панель с клавишами-модификаторами (например, shift, command) и иметь возможность щелкнуть по ней, как виртуальную клавиатуру.

Мне бы хотелось, чтобы это было так:

  • нажмите на виртуальный ключ (shift).
  • кнопка смены удерживается и удерживается нажатой.
  • введите что-то с моей стандартной клавиатурой.
  • нажмите еще раз на виртуальной клавише переключения, чтобы отпустить его.

вот код, который я использую:

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef shiftKeyDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, YES);
CGEventRef shiftKeyUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, NO);

CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyDown);
CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyUp);

CFRelease(shiftKeyUp);
CFRelease(shiftKeyDown);
CFRelease(source);

Я не могу найти способ держать его нажатым, пока не нажму на него в другой раз. Я, хотя кнопка "Push On Push Off" была ключевой, но, к сожалению, нет.: -)

любая помощь?

заблаговременно.

Ответ 1

Клавиша смены, фактически нажатая таким образом, автоматически выйдет автоматически, когда будет происходить событие, которое не содержит флаг сдвига. Это, кажется, ограничение или, возможно, ошибка, учитывая, что тип документации указывает иначе: https://developer.apple.com/reference/coregraphics/cgevent/1456564-init#discussion

Единственное, что я нашел для достижения того, что вы ищете, - это настроить прослушиватель событий и добавить флаг shift для каждого события, которое должно быть изменено с помощью клавиши Shift.

Пример того, как слушать события клавиатуры: fooobar.com/info/541187/... (Swift)

Пример того, как иметь флаг переключения для перехваченных событий:

event?.flags.insert(.maskShift)

Надеюсь, это поможет. Если кто-то знает, как сделать то же самое, не добавляя флаги в каждое событие, пожалуйста, сообщите.