CGEventTapCreate
을 사용하여 앱이 실행 중일 때 iTunes의 미디어 키를 "도용"합니다. CGEventTapCreate
에 전달하는 콜백 내부의 코드는 이벤트를 검사하고 미디어 키 중 하나임을 발견하면 적절한 알림을 기본 알림 센터에 게시합니다.CGEventTapCreate가 "키 다운"이벤트로 신비하게 깨졌습니다.
"키 업"이벤트에 대한 알림을 게시하면 올바르게 작동합니다. "키 다운"이벤트를 위해이를 수행하면 결국 앱에서 미디어 키 이벤트가 중지되고 iTunes가 작동합니다. 이 문제를 일으킬 수있는 아이디어가 있습니까? 코드의 관련 부분은, 왜 첫 번째 "경우"키 다운과 키 업 이벤트가 통과 할 수 있도록 모두의
enum {
...
PlayPauseKeyDown = 0x100A00,
PlayPauseKeyUp = 0x100B00,
...
};
static CGEventRef event_tap_callback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
if (!(type == NX_SYSDEFINED) || (type == NX_KEYUP) || (type == NX_KEYDOWN))
return event;
NSEvent* keyEvent = [NSEvent eventWithCGEvent: event];
if (keyEvent.type != NSSystemDefined) return event;
switch(keyEvent.data1)
{
case PlayPauseKeyUp: // <--- this works reliably
//case PlayPauseKeyDown: // <--- this will break eventually
post_notification(@"PlayPauseMediaKeyPressed", nil, nil);
return NULL;
... and so on ...
타이밍 문제인 것으로 보입니다. post_notification 대신 sleep (1)을 사용합니다. 몇 번의 키를 입력하면 PlayPauseKeyDown을 사용하는 경우 iTunes가 미디어 키를 훔칩니다. PlayPauseKeyUp을 사용하는 경우에도 작동합니다. – svintus