添加带有 NSEventMaskKeyDown 掩码的全局监视器不会触发

2023-12-08

我正在开发一个 MacOS 菜单栏应用程序,它需要跟踪一些全局快捷方式,以便于调整外部显示器上的显示亮度。但是,我无法让它在任何键盘相关事件上触发处理程序(鼠标事件工作得很好)。

我正在使用以下代码检查可访问性

NSDictionary *options = @{CFBridgingRelease(kAXTrustedCheckOptionPrompt): @YES};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);

然后,我使用以下方法添加全局事件监视器:

self.eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^(NSEvent * event) {
    NSLog(@"Some event");
}];

如果我切换NSEventMaskKeyDown to NSEventMaskMouseMove或其他与鼠标相关的东西,一切正常。如果我尝试NSEventMaskAny,没有任何东西再次触发(这看起来很奇怪,因为它应该仍然在鼠标上触发)。


事实是NSEventMaskMouseMove有效但是NSEventMaskKeyDown没有明确表明您的应用程序当前does not满足跟踪关键事件所需的所有要求。NSEventMaskMouseMove不被视为需要特殊安全保护的事件,甚至在以下情况下起作用AXIsProcessTrustedWithOptions回报false.

如所述,关键事件需要更多权限查尔斯·斯斯特卡 in 这个答案:

这不起作用的原因是因为全局监视器 .keyDown 事件比其他一些事件处理程序需要更多的权限, 包括有人认为这是重复的那个。这 主要是因为全局.keyDown监视器可用于恶意 目的,例如键盘记录器。所以有额外的安全保障 采取措施确保我们的合法性:

1) 您的应用程序需要进行代码签名。

2) 您的应用程序不需要启用应用程序沙箱,并且:

3)您的应用程序需要在安全和隐私中注册 首选项窗格中的“辅助功能”下。

您需要在应用程序目标的“常规”窗格中启用代码签名。确保“团队”和“签名证书”均已设置:

Turning on code-signing

您还必须在“功能”窗格中禁用“应用程序沙箱”:

Turning off sandbox

请注意,为了满足第三个要求,您还需要将 Xcode 本身添加到“辅助功能”窗格中。否则您希望能够调试您的事件监控。

关于关键事件的另外两个提示:

  • 全局监控仅报告其他应用程序中发生的事件。要监视您自己的应用程序中的事件,您需要使用addLocalMonitorForEventsMatchingMask或来自的实现Cocoa 事件处理指南.
  • 发送到安全文本字段的关键事件被屏蔽,如所述Jeff in 这个答案:

关键事件发送至NSSecureTextField (or NSSecureTextFieldCell) 被屏蔽,以便事件监视器无法拦截或读取它们。这是一项安全功能,可防止应用程序在输入密码时窃取密码,并且没有 API 可以绕过它。

关于与 AppStore 兼容的全局快捷方式的说明:很明显,您无法将沙箱禁用的应用程序上传到应用程序商店。如果您计划通过 Mac App Store (MAC) 分发应用程序,则必须使用不同的 API。这个线程提到了一系列对 MAS 友好的解决方案。他们使用RegisterEventHotKey旧 APICarbon天。苹果promised to not拒绝使用它的应用程序。

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

添加带有 NSEventMaskKeyDown 掩码的全局监视器不会触发 的相关文章

随机推荐

  • 在matlab中用渐变灰度颜色绘制圆

    我想在matlab中画一个带有渐变颜色的圆 但我不能 有谁可以帮助我吗 示例图片可以在这里找到 这是一种方法 N 200 this decides the size of image X Y meshgrid 1 1 N 1 1 1 N 1
  • r 过滤具有唯一字段的数据框[重复]

    这个问题在这里已经有答案了 我给出了编码和 R 的第一步 但我遇到了一个问题 我有一个具有以下格式的数据框 Months Person April Person1 May Person2 April Person1 June Person
  • 自定义属性编辑器不适用于 Spring MVC 中的请求参数?

    我正在尝试使用 Spring 注释创建一个多操作 Web 控制器 该控制器将负责添加和删除用户配置文件并为 jsp 页面准备参考数据 Controller public class ManageProfilesController Init
  • app-inventor:将应用程序安装到 SD 卡上

    编辑以显示提问后一周的当前状态 我深入研究了应用程序发明家 因为我的孩子 10 岁和 12 岁 即将获得他们的第一部 Android 手机 并且已经完成了一些拖放编程 游戏制作者 所以我认为这对他们来说可能是一个很好的切入点 我现在已经用应
  • Swift 中的可变参数

    我有一段非常简单的代码 它在 Swift 语言中使用可变参数 我不明白它为什么抱怨 Double 不是相当于 Double 吗 我知道我可以这样传递 printList 2 3 4 5 我猜 Variadic 和我想象的不一样 您可以传递多
  • Laravel 多重联合

    我在以 laravel 方式 添加具有多个联合的查询时遇到问题 我正在尝试完成一个与以下生成的查询等效的查询 ipsql for n 1 n lt total networks n ipsql SELECT FROM ip WHERE ne
  • 如何在实现 Condition/ConfigurationCondition 接口的类中使用 @Value 或 Environment

    我只使用 JavaConfig 我有以下声明 Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer return new
  • nginx x-accel-redirect 上“location”和“proxy_pass”的不同行为

    我的 nginx 配置如下 location mount points mount point1 internal alias repos mount point one location to proxy internal proxy p
  • Networkx 弹簧布局边缘权重

    我想知道如何spring layout考虑边缘权重 来自维基百科 另一种模型考虑每对节点 i j 的类似弹簧的力 其中每个弹簧的理想长度 delta ij 与节点 i 和 j 之间的图论距离成正比 而不使用单独的排斥力 最小化节点之间的欧几
  • 计算季度衰退和复苏

    给定这个数据框 GDP quarter 0 250 2015q1 1 260 2015q1 2 250 2015q3 3 240 2015q4 4 250 2016q1 5 260 2016q2 我怎样才能知道哪些季度是衰退 哪些季度是复苏
  • android中如何获取sd卡上的文件路径

    大家好 我的 SD 卡中有 mp3 文件 如何从sd卡获取mp3歌曲的文件路径 请帮助我 您可以从以下代码获取sdcard的路径 File extStore Environment getExternalStorageDirectory 然
  • 我可以压缩所有 python 标准库并且 python 仍然能够导入它吗?

    我读过一个教程 您可以将所有 libs 文件编译为 pyc 然后将所有 pyc 打包为压缩文件 然后蟒蛇仍然像魔法一样发挥作用 而且它变得明显变小了 但是当我将所有 pyc 文件压缩为 python36 zip 并将它们保存在 lib py
  • CSS 背景图像未加载

    我已经遵循了所有教程 它们都说了要说的话 我在 css 样式表中指定了主体内部的背景 但页面仅显示空白的白色背景 图像与 html 和 css 页面位于同一目录中 教程说的是 已被弃用 所以我在 css 中使用 body backgroun
  • 在html中链接jquery

    我无法成功将 jQuery 链接到我的 html 我已经编写了最简单的 jQuery 代码 这样我就知道它是正确的 并且我已经尝试了我能想到的一切 搜索并没有帮助 我的 html 文件名 test html
  • Python lxml:忽略 XML 声明(错误)

    我正在尝试解析文件浏览器 Thunar 的自定义操作文件 config Thunar uca xml 与lxmlPython 模块 由于某种原因 Thunar 显然写了一个malformed declaration进入这些文件 显然 ver
  • 从编译的发行版 exe 中删除类字符串名称

    我编译我的应用程序项目的发行版本 当我使用二进制编辑器查看编译后的最终 exe 时 我可以看到我自己创建的对象的所有类名称 例如 TPolygon TRectangle 等 作为 exe 内的二进制文本数据 我如何从 exe 中删除此信息
  • 安全下载文件

    我想要一个文件夹 我们称之为文档 其中包含登录用户可以下载的文档 这些包含非常敏感的信息 如何才能最好地保护该文件夹 我有 PHP 背景 所以想知道我是否忽略了任何事情 我将使用 htaccess 保护该文件夹 并且当用户单击下载时 他们永
  • 与一个进程进行多次通信而不破坏管道?

    这不是我第一次遇到这个问题 而且它确实困扰着我 每当我使用 Python 打开管道时subprocess模块 我只能communicate正如文档所指定的那样 使用它一次 Read data from stdout and stderr u
  • Java 输入不起作用(初学者)

    由于某种原因 我的代码不接受最后一行的输入 您想订购什么 谁能告诉我我的错误是什么 它编译正确 一切顺利 我只是一个初学者 所以请告诉我基本术语 import java util Scanner import java util class
  • 添加带有 NSEventMaskKeyDown 掩码的全局监视器不会触发

    我正在开发一个 MacOS 菜单栏应用程序 它需要跟踪一些全局快捷方式 以便于调整外部显示器上的显示亮度 但是 我无法让它在任何键盘相关事件上触发处理程序 鼠标事件工作得很好 我正在使用以下代码检查可访问性 NSDictionary opt