gpt4 book ai didi

cocoa - IMKit 捕获 NSKeyup 事件

转载 作者:行者123 更新时间:2023-12-03 16:41:00 29 4
gpt4 key购买 nike

作为一个实验,我试图实现以下目标:

  • 让空格键充当修饰键 - 就像 Shift 键一样 - 按住空格键并键入按键会打印不同的字母。释放空格键会将状态恢复到正常状态,只需按下它就可以像正常的空格键一样。

我正在考虑处理 keydown 和 keyup 事件,但显然 IMKServerInput Protocol 中的 handleEvent:client:似乎只捕获按键和鼠标事件。

由于没有太多 cocoa 经验,我尝试了一些方法但没有成功:

我得出的结论是 IMKit 只能被动接收事件。由于它不是应用程序,因此没有可重写的 keyUp: 方法 - AFAIK,IMKit 不会继承 NSResponder 类。

不幸的是,cocoa 太宽泛了,对于像我这样的新手来说,需要深入研究的文档要少得多(或者充斥着无用的文档)。

有人可以帮助我找到正确的方向吗?

最佳答案

我一一尝试了所有可能的替代方案,最终通过创建一个全局的EventTap来实现与CGEventTap

代码基本上如下所示:

// Create an event tap.
CGEventMask eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp));
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap,
kCGHeadInsertEventTap,
0,
eventMask,
myCGEventCallback,
NULL);

if (!eventTap) {
NSLog(@"failed to create event tap\n");
return NO;
} else {
// Create a run loop source.
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
// Add to the current run loop.
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
// Enable the event tap.
CGEventTapEnable(eventTap, true);
return YES;
}

其中 myCGEventCallback 处理全局状态。

同时,以下是我发现的一些内容:

  • 根据The Key-Input Message Sequence在文档中,应用程序仅在尝试链中的其他处理程序后才将 keydown 事件传递给输入法工具包。您不能让 IMKServerInput “捕获”NSKeyUp 事件。仅将 NSKeyUpMask 添加到 recognizedEvents: 是行不通的。
  • addLocalMonitorForEventsMatchingMask:handler:CGEventTapCreateForPSN 不会捕获该事件。我想这是因为虽然输入方法可以作为单独的进程运行,但事件本身是从应用程序(如 TextEdit)中触发的,并移交给输入方法。
  • IOHIDManager:用于添加新的硬件设备和制作驱动程序。
  • 创建全局 EventTap 需要使用 sudo 权限运行进程(将输入法复制到 /Library/InputMethods 不能使用 sudo 权限运行),或者将应用程序注册到辅助功能控制。这位于 Mavericks 中的系统偏好设置 → 安全和隐私 → 隐私选项卡 → 辅助功能中。

关于cocoa - IMKit 捕获 NSKeyup 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620864/

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