我在使用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(1),并在那里,在几次按键之后,如果使用PlayPauseKeyDown,iTunes会盗取媒体密钥。如果我使用PlayPauseKeyUp,仍然有效。 – svintus 2010-06-03 19:40:44