gpt4 book ai didi

objective-c - 拦截/禁用键盘快捷键(例如 CMD+q)

转载 作者:太空狗 更新时间:2023-10-30 03:51:50 31 4
gpt4 key购买 nike

有没有办法在全局范围内拦截和更改/忽略 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 上,有 modifierFlagskeyCode 属性。 keyCode 是按下的键的代码,modifierFlags 是按下的不同修饰符(Shift、Alt/Option、Command 等)。

只需在KeyDownCallback 方法中return NULL; 来停止传播事件。

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

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

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

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

关于objective-c - 拦截/禁用键盘快捷键(例如 CMD+q),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596907/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com