Отводы событий: изменение результатов с помощью CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent - PullRequest
4 голосов
/ 16 февраля 2009

У меня острая проблема с публикацией события из крана события. Я нажимаю на NSSystemDefined в kCGHIDEventTap, затем заменяю событие новым. Проблема, с которой я сталкиваюсь, заключается в том, что в зависимости от того, как я публикую событие, его видят только некоторые приложения. Мои тестовые приложения - Opera, Firefox, Quicksilver и Xcode. Вот различные методы, которые я пробовал в своем обратном вызове события, с результатами. Я ожидаю действия («правильный ответ») от каждого приложения; «системный гудок» означает системный звук «ничто не связано с этим ключом».

  1. Создайте новое событие и верните его из обратного вызова. Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал

  2. Создать новое событие, опубликовать в kCGSessionEventTap с помощью CGEventPost, вернуть ноль. Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал

  3. Создать новое событие, опубликовать в kCGAnnotatedSessionEventTap с CGEventPost, вернуть ноль. Opera: правильный ответ, Firefox: правильный ответ, Quicksilver: нет ответа / системный сигнал, Xcode: нет ответа / системный сигнал

  4. Создать новое событие, опубликовать с помощью CGEventTapPostEvent, вернуть ноль. Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал

  5. Создайте новое событие, отправьте сообщение в kCGSessionEventTap с помощью CGEventPost и верните новое событие. Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал

  6. Создайте новое событие, опубликуйте в kCGAnnotatedSessionEventTap с CGEventPost и верните новое событие. Opera: правильный ответ и системный сигнал, Firefox: правильный ответ и системный сигнал, Quicksilver: правильный ответ и системный сигнал, Xcode: нет ответа / двойной системный сигнал

  7. Создайте новое событие, опубликуйте сообщение с помощью CGEventTapPostEvent и верните новое событие. Опера: нет ответа / системный сигнал, Firefox: нет ответа / системный сигнал, Quicksilver: правильный ответ, Xcode: нет ответа / системный сигнал

(6) - лучший вариант, но пользователи жалуются на дополнительный системный звуковой сигнал при правильных ответах, который, я полагаю, связан с двойной публикацией события. Я не уверен в других комбинациях, чтобы попробовать, или где еще искать. Кто-нибудь может предложить какое-либо руководство? Есть ли способ получить результаты как возврата события из моего обратного вызова, так и отправки на аннотированный кран, не выполняя и то, и другое?

Извините за длинный вопрос; Я много экспериментировал.

Заранее спасибо


Обновление: это код, который я использую для создания события:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);

1 Ответ

4 голосов
/ 13 апреля 2010

Я думаю, что исправил это. Я использовал +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] для создания NSEvent, а затем возвращал это событие -CGEvent. Я переключился на CGEventCreateKeyboardEvent, используя источник события, созданный из исходного события с CGEventCreateSourceFromEvent, и возвращая событие из обратного вызова. Все мои тесты сейчас проходят.

...