无论如何,在全局范围内拦截和更改/忽略Objective-C中给定的Mac应用程序快捷方式?
一个例子是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);
Run Code Online (Sandbox Code Playgroud)
接下来是"回调":
static CGEventRef KeyDownCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
/* Do something with the event */
NSEvent *e = [NSEvent eventWithCGEvent:event];
return event;
}
Run Code Online (Sandbox Code Playgroud)
在解析的NSEvent上,有modifierFlags和keyCode属性.keyCode是按下的键的代码,是按下modifierFlags的不同修改器(Shift,Alt/Option,Command等).
只是return NULL;在KeyDownCallback方法中阻止事件传播.
注意:事件点击超时似乎存在问题,要解决此问题,您可以"重置"事件点击.
在KeyDownCallback方法中,检查是否CGEventType type是kCGEventTapDisabledByTimeout这样:
if (type == kCGEventTapDisabledByTimeout)
{
/* Reset eventTap */
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
在哪里Reset eventTap,再次执行上面的事件监听器的设置.
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |