Я использую CGEventTapCreateForPSN
для захвата и фильтрации ключей для моего приложения. Я не заинтересован в перехвате событий для других приложений. Я почти уверен, что нажатие на событие слишком тяжело для моей цели, но мне не удалось найти лучший способ, и использование функции "Событие" работает.
В частности, этот код делает то, что я хочу.
GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
И мой обратный вызов обрабатывается красиво, причем события перехватываются только из текущего приложения.
К сожалению, все методы для получения текущего ProcessSerialNumber
устарели с 10.9. Существует старый стандартный способ передачи ProcessSerialNumber
в другие процедуры в том же процессе с этой инициализацией...
ProcessSerialNumber psn = { 0, kCurrentProcess };
но это не работает при вызове CGEventTapCreateForPSN
. Документы в файле заголовка указывают столько же, и следующий фрагмент кода возвращает NULL
в качестве подтверждения.
ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
Я могу использовать CGEventTapCreate
, но он удаляет весь хост, и тогда мне нужно будет фильтровать все, что не направлено на мое приложение, а CGEventTapProxy
непрозрачно, и я не знаю, как его использовать для определения если его приложение или нет.
Я подтвердил, что устаревший код все еще работает, но Apple может решить удалить его в любое время. Итак, есть ли у кого-нибудь идея, как я должен действовать для вызова CGEventTapCreateForPSN
в Mavericks и далее?
Спасибо!