gpt4 book ai didi

macos - 应用程序运行时停止拦截键盘输入 - CGEventTap

转载 作者:行者123 更新时间:2023-12-03 17:41:07 30 4
gpt4 key购买 nike

使用 CGEventTap 停止观看键盘事件点击的正确方法是什么?

我正在构建一个简单的后台应用程序,用于转换特定键的输出。感谢this excellent post on CGEventTap ,我已经能够启用 key 转换。不幸的是,我似乎无法阻止它,除非杀死该应用程序。

当用户切换复选框以打开或关闭该功能时,将调用以下方法。切换立即发生。切换“关闭”可能需要一分钟或更长时间才会生效。我通过日志看到“已禁用。停止转换水龙头。”被检测到。但关键的转变仍在继续。我不明白为什么。

- (void)watchEventTap
{
@autoreleasepool
{
CFRunLoopSourceRef runLoopSource = NULL;
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED), myCGEventCallback, NULL);
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);

if (!eventTap)
{
NSLog(@"Couldn't create event tap!");
exit(1);
}

if (self.shortcutEnabled) // User default toggled ON
{
NSLog(@"Enabled. Convert taps.");
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
// CFRunLoopRun(); // This blocks rest of app from executing
}
else // User default toggled OFF
{
NSLog(@"Disabled. Stop converting taps.");
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, false);
// Clean up the event tap and source after ourselves.
CFMachPortInvalidate(eventTap);
CFRunLoopSourceInvalidate(runLoopSource);
CFRelease(eventTap);
CFRelease(runLoopSource);
eventTap = NULL;
runLoopSource = NULL;
}
}
// exit(0); // This blocks rest of app from executing
}

感谢您的任何建议。我是新构建 Mac OS X 应用程序的人,所以如果我做了一些无知的事情,请原谅我。

最佳答案

感谢一位经验丰富的 Mac 开发人员,我的问题得到了解决。每次调用该方法时,我都会创建一个新的 runLoopsSource。

现在我已经为tapEvent 和runLoop 创建了实例变量。只需一行即可停止 eventTap。修改方法如下:

- (void)watchEventTap
{

@autoreleasepool
{

if ( [[NSUserDefaults standardUserDefaults] isEnabledNumLockDV] == YES ) // User default toggled ON
{
_runLoopSource = NULL;
_eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED), myCGEventCallback, NULL);
_runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, _eventTap, 0);

if (!_eventTap)
{
NSLog(@"Couldn't create event tap!");
exit(1);
}

NSLog(@"Enabled. Convert taps.");
CFRunLoopAddSource(CFRunLoopGetCurrent(), _runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(_eventTap, true);
}
else if ( [[NSUserDefaults standardUserDefaults] isEnabledNumLockDV] == NO ) // User default toggled OFF
{
NSLog(@"Disabled. Stop converting taps.");
CGEventTapEnable(_eventTap, false);
}

}
}

关于macos - 应用程序运行时停止拦截键盘输入 - CGEventTap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777259/

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