У меня острая проблема с публикацией события из крана события. Я нажимаю на NSSystemDefined в kCGHIDEventTap, затем заменяю событие новым. Проблема, с которой я сталкиваюсь, заключается в том, что в зависимости от того, как я публикую событие, его видят только некоторые приложения. Мои тестовые приложения - Opera, Firefox, Quicksilver и Xcode. Вот различные методы, которые я пробовал в своем обратном вызове события, с результатами. Я ожидаю действия («правильный ответ») от каждого приложения; «системный гудок» означает системный звук «ничто не связано с этим ключом».
Создайте новое событие и верните его из обратного вызова.
Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал
Создать новое событие, опубликовать в kCGSessionEventTap с помощью CGEventPost, вернуть ноль.
Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал
Создать новое событие, опубликовать в kCGAnnotatedSessionEventTap с CGEventPost, вернуть ноль.
Opera: правильный ответ, Firefox: правильный ответ, Quicksilver: нет ответа / системный сигнал, Xcode: нет ответа / системный сигнал
Создать новое событие, опубликовать с помощью CGEventTapPostEvent, вернуть ноль.
Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал
Создайте новое событие, отправьте сообщение в kCGSessionEventTap с помощью CGEventPost и верните новое событие.
Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал
Создайте новое событие, опубликуйте в kCGAnnotatedSessionEventTap с CGEventPost и верните новое событие.
Opera: правильный ответ и системный сигнал, Firefox: правильный ответ и системный сигнал, Quicksilver: правильный ответ и системный сигнал, Xcode: нет ответа / двойной системный сигнал
Создайте новое событие, опубликуйте сообщение с помощью CGEventTapPostEvent и верните новое событие.
Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал
(6) - лучший вариант, но пользователи жалуются на дополнительный системный звуковой сигнал при правильных ответах, который, я полагаю, связан с двойной публикацией события. Я не уверен в других комбинациях, чтобы попробовать, или где еще искать. Кто-нибудь может предложить какое-либо руководство? Есть ли способ получить результаты как возврата события из моего обратного вызова, так и отправки на аннотированный кран, не выполняя и то, и другое?
Извините за длинный вопрос; Я много экспериментировал.
Заранее спасибо
Обновление: это код, который я использую для создания события:
CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);