【发布时间】:2011-02-27 11:41:09
【问题描述】:
当我的应用程序运行时,我正在使用CGEventTapCreate 从 iTunes 中“窃取”媒体密钥。我传递给CGEventTapCreate 的回调中的代码检查事件,如果发现它是媒体键之一,则向默认通知中心发布适当的通知。
现在,如果我发布“key up”事件的通知,这可以正常工作。如果我为“key down”事件这样做,最终我的应用程序将停止获取媒体键事件并且 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 仍然有效。
标签: cocoa macos macos-carbon core-foundation