我在用着CGEventTapCreate
当我的应用程序运行时,从 iTunes 中“窃取”媒体密钥。我传递给的回调内部的代码CGEventTapCreate
检查该事件,如果发现它是媒体键之一,则将适当的通知发布到默认通知中心。
现在,如果我发布“key up”事件的通知,则效果很好。如果我对“按键按下”事件执行此操作,最终我的应用程序将停止获取媒体按键事件并由 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 ...
如果回调时间太长,是否会终止我的事件点击?
有些人怀疑 Snow Leopard 有一个错误,有时会禁用事件点击,即使它们不会花费太长时间。要处理这个问题,您可以观察事件类型kCGEventTapDisabledByTimeout
,并通过重新启用您的水龙头来响应CGEventTapEnable
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)