无论如何,是否可以在全局范围内拦截和更改/忽略 Mac 应用程序的 Objective-C 中给定的快捷方式?
一个例子是 BetterTouchTool,它可以覆盖您提供的任何快捷方式。
我想要做的是在打开特定应用程序时阻止“退出”快捷方式(即CMD+ )(因为在这种情况下,快捷方式被无意中按下并关闭了某些人不希望的应用程序)。q
简而言之,我可以侦听任何全局键事件,然后在事件传递到预期应用程序之前更改事件吗?
无论如何,是否可以在全局范围内拦截和更改/忽略 Mac 应用程序的 Objective-C 中给定的快捷方式?
一个例子是 BetterTouchTool,它可以覆盖您提供的任何快捷方式。
我想要做的是在打开特定应用程序时阻止“退出”快捷方式(即CMD+ )(因为在这种情况下,快捷方式被无意中按下并关闭了某些人不希望的应用程序)。q
简而言之,我可以侦听任何全局键事件,然后在事件传递到预期应用程序之前更改事件吗?
这是设置事件侦听器的方法
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown),
&KeyDownCallback,
NULL);
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(NULL, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CFRelease(runLoopSource);
CGEventTapEnable(eventTap, true);
然后这里是“回调”:
static CGEventRef KeyDownCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
/* Do something with the event */
NSEvent *e = [NSEvent eventWithCGEvent:event];
return event;
}
在解析的 NSEvent 上,有modifierFlags
和keyCode
属性。keyCode
是按下的键的代码,是按下modifierFlags
的不同修饰符(Shift、Alt/Option、Command 等)。
只需return NULL;
在KeyDownCallback
方法中阻止事件传播。
注意:事件点击超时似乎存在问题,要解决此问题,您可以“重置”事件点击。
在KeyDownCallback
方法中,检查是否CGEventType type
是kCGEventTapDisabledByTimeout
这样的:
if (type == kCGEventTapDisabledByTimeout)
{
/* Reset eventTap */
return NULL;
}
在哪里Reset eventTap
,再次执行上面的事件监听器的设置。