【问题标题】:Intercept/Disable keyboard shortcuts (ex. CMD+q)拦截/禁用键盘快捷键(例如 CMD+q)
【发布时间】:2013-10-25 18:21:56
【问题描述】:

对于 Mac 应用程序,Objective-C 中是否存在全局拦截和更改/忽略给定快捷方式的方法?

BetterTouchTool 就是一个例子,它可以覆盖您提供的任何快捷方式。

我想要做的是在特定应用程序打开时阻止“退出”快捷方式(即 CMD+q)(因为在这种情况下,快捷方式是无意的某些人不希望按下并关闭应用程序)。

简而言之,我可以侦听任何全局键事件,然后在事件将其传递到预期的应用程序之前更改它吗?

【问题讨论】:

  • 作为一个完全非编程的解决方案,您可以在系统偏好设置>键盘>键盘快捷方式>应用程序快捷方式>[特定应用程序]中更改该应用程序的等效键(我认为这已经移动在 Mavericks 中,但它仍应在某处的系统偏好设置中。)例如,我将浏览器的退出菜单项设置为 ^⌥⌘Q。编码方面,您正在寻找 CGEventTaps。
  • 这不起作用,因为应用程序是使用 bash 脚本启动的,而不是 *.app 应用程序。我会研究一下 CGEventTaps,你有任何即时资源吗?
  • 明白了。 Quartz Event Services reference 是官方文档。

标签: objective-c macos


【解决方案1】:

这里是设置事件监听器的方法

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 上,有 modifierFlagskeyCode 属性。 keyCode 是按下的键的代码,modifierFlags 是按下的不同修饰符(Shift、Alt/Option、Command 等)。

只需在KeyDownCallback 方法中输入return NULL; 即可阻止事件传播。

注意:事件点击超时似乎存在问题,要解决此问题,您可以“重置”事件点击。

KeyDownCallback 方法中,检查CGEventType type 是否为kCGEventTapDisabledByTimeout,如下所示:

if (type == kCGEventTapDisabledByTimeout)
{
    /* Reset eventTap */
    return NULL;
}

Reset eventTap在哪里,再次执行上面的事件监听器的设置。

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2012-11-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多