OS X:检测系统范围的 keyDown 事件?

2023-12-21

我正在为 Mac OS X 开发一个打字辅导应用程序,即使该应用程序未处于焦点状态,也需要将击键转发给它。

有没有办法让系统将击键转发到应用程序(可能通过 NSDistributedNotificationCenter)?我用谷歌搜索了自己愚蠢的,但没能找到答案......

EDIT: 下面的示例代码.

感谢@NSGod 为我指明了正确的方向——我最终添加了一个全局事件监视器 https://developer.apple.com/documentation/appkit/nsevent/1535472-addglobalmonitorforeventsmatchin使用该方法addGlobalMonitorForEventsMatchingMask:handler:,效果很好。为了完整起见,我的实现如下所示:

// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
                                       handler:^(NSEvent *event){

    NSString *chars = [[event characters] lowercaseString];
    unichar character = [chars characterAtIndex:0];

    NSLog(@"keydown globally! Which key? This key: %c", character);

}];

对我来说,棘手的部分是使用块,所以我会给出一些描述,以防它对任何人有帮助:

上面的代码需要注意的是,它都是一次方法调用在 NSEvent 上。该块直接作为参数提供to功能。您可以将其视为内联委托方法。因为这需要我一段时间才能理解,所以我将在这里一步一步地完成它:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask

这第一点没有问题。您正在调用 NSEvent 上的类方法,并告诉它您要监视哪个事件,在本例中为 NSKeyDownMask。 A支持的事件类型的掩码列表 http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:可以被找寻到here http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:.

现在,我们来到棘手的部分:处理程序,它需要一个块:

handler:^(NSEvent *event){

我遇到了一些编译错误才得到这个正确的结果,但是(谢谢苹果)它们是非常有建设性的错误消息。首先要注意的是克拉^。这标志着区块的开始。之后,在括号内,

NSEvent *event

它声明了您将在块中使用的变量来捕获事件。你可以称之为

NSEvent *someCustomNameForAnEvent

没关系,您只需在块中使用该名称即可。那么,这就是全部内容了。确保关闭大括号和方括号以完成方法调用:

}];

你就完成了!这确实是一种“单行”。在应用程序中的何处执行此调用并不重要 - 我在 AppDelegate 的 applicationDidFinishLaunching 方法中执行此操作。然后,在该块内,您可以从应用程序内调用其他方法。


如果您满足 OS X 10.6+ 的最低要求,并且可以满足对事件流的“只读”访问,您可以在 Cocoa 中安装全局事件监视器:Cocoa 事件处理指南:监控事件 http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html.

如果您需要支持 OS X 10.5 及更早版本,并且只读访问权限是可以的,并且不介意使用 Carbon 事件管理器,那么您基本上可以使用 Carbon 等效项GetEventMonitorTarget()。 (不过,您将很难找到有关该方法的任何(官方)文档)。我相信该 API 首次在 OS X 10.3 中提供。

如果您需要对事件流进行读写访问,那么您将需要查看属于 ApplicationServices > CoreGraphics 一部分的稍低级别的 API:CGEventTapCreate() http://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate和朋友。该功能首次在 10.4 中提供。

请注意,所有 3 种方法都要求用户在“系统偏好设置”>“通用访问”首选项窗格中启用“启用对辅助设备的访问”(至少对于关键事件)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OS X:检测系统范围的 keyDown 事件? 的相关文章

  • 未找到符号,预计出现在平面命名空间 ObjC++ 中

    我可能遇到了一个简单的问题 但是在编译过程中没有任何信息错误或警告来提醒我出了什么问题 我有一个 Objective C 应用程序 其中包含 C 主文件和 ObjC 头文件 它构建得很好 但是当运行时 它会给出以下错误消息 Dyld Err
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 检测从内核扩展的文件复制

    我正在尝试构建 POC 该 POC 可以使用 fileop 范围回调来识别来自基于 kauth 的内核扩展的文件复制活动 但是 复制文件似乎涉及两个单独的身份验证操作 从中打开 src 文件并创建新文件 我的目标相当简单 在填充数据后检测新
  • 如何以编程方式添加 NSMenu?

    我没有使用storyboard和xib 只使用了代码 我想以编程方式添加 编辑 菜单 我的问题是 1 如何显示 编辑 菜单 评论问题1 需要输入什么代码 2 Swift 提供了复制和粘贴等操作吗 class TestManager NSOb
  • 在 Mac 上更新 Make 版本

    我正在尝试更新 mac 上的 make 版本 但遇到了问题 最小项目依赖项是 4 1 但我的版本似乎是 3 81 我已将 Xcode 更新到最新版本并安装了命令行工具 但它似乎仍然是旧版本 有谁遇到过这个问题或知道解决方法吗 这是我所做的
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • CIImage内存未释放

    我正在尝试拍摄一系列图像 混合当时的 X 图像并生成新图像 这是我必须完成此任务的代码 static func blendImages blendFrames Int blendMode CIImage BlendMode imagePat
  • Cocoa 我可以隐藏/显示 NSTextField / NSSecureTextField

    有没有办法在 Cocoa 中打开和关闭 secureTextField 操作系统 我希望用户可以选择查看他们的密码 在 iOS 中 我可以执行类似 textField setSecureTextEntry YES 的操作 我找到了 secu
  • 如何使用 Objective-C 加载 dylib 或 .a(静态库)文件?

    C 代码 Windows Assembly assembly Assembly LoadFrom AssemblyPath System Type objTypes assembly GetTypes Type libType null 我
  • 在 Safari for Lion (OS X 10.7) 中设置滚动条颜色

    Lion 中的新滚动条似乎会根据 body 元素的背景颜色调整 Safari 中的颜色 有没有办法手动设置滚动条是深色还是浅色 我知道有 webkit CSS 选项来设置滚动条的样式 这实际上早于新的 Lion 滚动条 我使用该方法的唯一问
  • 以编程方式检索 OSX 网络/代理配置值

    考虑到我的应用程序具有当前登录的管理员用户的用户 ID 和密码 是否可以从 OSX 网络设置中检索配置值 对 高级 代理 选项卡内容特别感兴趣 通过设置 API 完成 以下是从 OSX 网络设置中获取 PAC URL 字符串的示例 stat
  • 使用 librsvg / rsvg 通过 ImageMagick 转换 SVG 图像

    我知道这个问题在这里有几个答案版本 如下所示 ImageMagick 将 SVG 转换为 PNG 无法在启用 RSVG 的情况下工作 https stackoverflow com questions 11592085 imagemagic
  • 当我的 Mac 进入睡眠状态时,我的应用程序会发生什么情况?

    当 Mac OS X 进入睡眠状态时 由于关闭笔记本电脑或从 Apple 菜单中选择 睡眠 它如何暂停正在执行的进程 我认为非窗口进程只是在任意执行点挂起 对于 Cocoa 应用程序来说也是如此 还是操作系统会等到控制权返回到运行循环调度程
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System
  • 如何在 Mac 上运行 virtualenv python

    我正在尝试使用 virtualenv 在我的 mac 上创建虚拟 python 环境 我已经下载了 virtualenv 但是我无法运行它 因为即使我提供了正确的路径 它也找不到我的 python3 安装路径 这是我运行的命令和响应 vir
  • 标签栏随键盘一起上升

    这个问题之前已经发过 但是没有答案 Problem TabBar gt 2 个选项卡 选项卡一有一个Scrollview and an EddiText 标签二 其他 贴带时EditText 软键盘上升 TabBar与它一起 一个丑陋的解决
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • localhost 拒绝在 chrome mac 中连接

    我正在使用 webpack dev server 使用此命令运行服务器 npm run dev 当我使用npm start 它工作得很好 但不想这样做 因为它是为了生产 到目前为止我的服务器运行良好http 本地主机 3000 http l
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho

随机推荐