问题标签 [cgeventtap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
833 浏览

objective-c - 为什么 [NSRunningApplication activateWithOptions:] 返回 NO

当没有明显原因导致应用程序无法激活时,我遇到了[NSRunningApplication activateWithOptions:]返回问题。NO

这不是-[NSRunningApplication activateWithOptions:] 不工作的副本

该问题的公认答案是使用NSApplicationActivateIgnoringOtherApps代替,NSApplicationActivateAllWindows但这不是可接受的答案,因为这两个选项旨在以选项值所暗示的不同方式激活应用程序。

我的代码中有一些地方[NSRunningApplication activateWithOptions:]可以工作,但是当通过 EventTap 调用它时,它几乎总是返回NO,而不管使用NSApplicationActivateAllWindowsNSApplicationActivateIgnoringOtherApps作为option参数。我说“几乎”总是返回NO的原因是因为第一次调用它时,它确实有效。所有第 2 次和后续调用均失败。

我基本上是在处理 Dock 中应用程序图标上的单击事件。我正在使用安装在Dock使用CGEventTapCreateForPSN(). 在事件点击回调中,我已成功确定process identifierDock. 进程 ID 是使用Accessibility API.

现在我需要激活应用程序,所以我调用:

在上面的示例中,我已经验证了 thatcurrentApp是有效的,并且 that bundleIdentifier和 对象中processIdentifier的其他一些实例 varRunningApplication是正确的。

如上所述,无论NSApplicationActivationOptions使用什么,应用程序都不会激活,并且方法返回NO. 同样,它偶尔会在第一次单击时起作用,但在所有后续单击任何应用程序的停靠图标时都会失败。

谁能解释为什么这么简单的方法会失败?可能为什么它只在第一次被调用时才起作用?为什么它在不从 EventTap 执行时总是有效?

我花了几个小时试图解决这个问题,唯一总是有效的方法是使用不推荐使用的方法SetFrontProcessWithOptions(&psn, 0);而不是[NSRunningApplication activateWithOptions:NSApplicationActivateAllWindows].

我尝试将调用包装到[NSRunningApplication activateWithOptions:]within dispatch_async,我还尝试使用 EventTap 中的操作队列,但都没有解决问题。最后,我尝试发送通知并[NSRunningApplication activateWithOptions:]从通知回调中调用,这也失败了。这是我的事件水龙头中的代码:

非常感谢任何帮助!附加的调试屏幕抓取显示了第一次尝试通过单击其停靠图标来激活应用程序是如何成功的,以及后续单击如何无法激活应用程序。

在此处输入图像描述

更新并解决了一半: 我已经确定了为什么[NSRunningApplication activateWithOptions:]在第一次尝试时有效而在第二次和后续尝试中失败。第一次单击 Dock 中的应用程序图标时,我的应用程序是活动应用程序。在随后单击应用程序图标时,其他一些应用程序处于活动状态。所以这里的问题似乎是[NSRunningApplication activateWithOptions:]只有当我的应用程序是最前面的进程时才会起作用。

如果我[NSApp activateIgnoringOtherApps:YES];在调用之前添加[NSRunningApplication activateWithOptions:],它始终按预期工作,但是,由于仅激活我的应用程序然后激活不同的应用程序,菜单栏会闪烁。于是问题就变成了:

[NSRunningApplication activateWithOptions:]当我的应用程序不是最前面的应用程序时,有什么方法可以开始工作吗?并且activateWithOptions:应该以这种方式工作?

0 投票
1 回答
558 浏览

swift - 不能 CGEventTapCreate

我从命令行工具项目中 main.swift 下面的链接复制并粘贴了代码。 你如何在 Swift 中使用 CGEventTapCreate?
它构建没有错误,但是当我运行时,guard let eventTap = CGEventTapCreate... 失败。我认为 CGEventTapCreate 中的 eventTap 为零。
我假设是因为系统偏好设置>安全和隐私>可访问性中不允许该应用程序。不过,我没有收到允许该应用程序进入可访问性类别的通知。我需要在项目设置中设置一些东西来触发它吗?它虽然从命令行运行。由于某种原因,我无法从 xCode 运行。这是上面链接中稍作修改的代码。

0 投票
0 回答
184 浏览

objective-c - macOS 预登录窗口中的键盘和鼠标模拟失败

我是启动代理和守护进程的新手。我创建了一个预登录代理,它会在登录窗口打开时启动我的应用程序。我可以在用户会话中使用 CGEventPost 模拟键盘和鼠标事件。请参考代码

//对于键盘

//对于鼠标

//登录前启动代理

CGEventPost 在登录前窗口中不起作用。如何解决?有没有替代方法?

0 投票
0 回答
244 浏览

objective-c - 检测何时使用允许应用程序使用通用访问

我正在为需要使用通用访问(可访问性和事件点击)的 OSX 开发实用程序。

我正在使用 AXIsProcessTrustedWithOptions 来检查应用程序是否被允许。我每秒检查一次此状态(池),以检测用户何时允许它。

不幸的是,AXIsProcessTrustedWithOptions 总是返回 false,即使应用程序已被允许。

我知道这是可能的,因为像 popclip 这样的其他应用程序正在这样做,但我无法弄清楚我做错了什么。

补充:代码

0 投票
1 回答
614 浏览

swift - Swift 3 CFRunLoopRun 在线程中?

我刚刚制作了一个简单的测试应用程序来显示击键的键码和修饰符。它适用于 3 次击键,然后应用程序崩溃。当它崩溃时,调试控制台最后只显示(LLDB)。有什么建议可能导致这种情况吗?也许与线程或指针有关,但我不确定如何解决这个问题。我包括下面的代码。我真的很感激任何帮助!谢谢!

0 投票
0 回答
270 浏览

objective-c - CGEventTap 制作 CGEvent 释放实例的 NSEvent

我正在使用 EventTap,我需要在代码中设置 CGEvent 的压力(我正在制作压力平均应用程序)。

目前,除了将我的 CGEvent 转换为 NSEvent 来改变压力之外,我没有看到任何其他方法。现在的问题是,有时我会遇到“解除分配的实例错误”并且我的应用程序崩溃了。我正在使用ARC。我使用 Zombie Instrument 来追踪问题。这是仪器的屏幕截图。显然,CGEvent 或 NSEvent 的某个地方正在收到一条发布消息,但它已经发布了。我不知道如何才能更好地控制这个发布过程...... :(。

这是我在 handleCGEvent 方法中使用的代码

……

谢谢,非常感谢任何帮助!!!!

僵尸仪器截图!!!

0 投票
1 回答
555 浏览

swift3 - 使用 CGEvent 从键码中快速获取字符

我有一个关键代码:

有没有办法把它翻译成一个字符?

这似乎是我需要的,但它看起来很可怕!有人可以解释如何从 swift 调用该函数吗?谢谢!

0 投票
1 回答
445 浏览

swift3 - 从 CGEvent 解析键盘快捷键

我正在尝试从 myCGEventCallback 解析 CGEvent 以获取键盘事件。我可以访问修饰符标志、键码、UniChar。

到目前为止,我设法让它适用于一些组合,如 command+shift+f,但对于其他一些组合,我遇到了一些问题。

  1. 控制和选项似乎给了我一些符号而不是字母的 UniChar。例如,option+g 将给我 option+copyright 符号而不是 option+g。
  2. 我无法从 UniChar 获取功能键和光标。

解释结果的最佳方式是什么?例如,我想得到一个像 control+g、option+control+g 或 option+shift+f1 这样的结果。这是 myCGEventCallback 的代码。谢谢!

0 投票
0 回答
612 浏览

swift - 如何在 Swift 中将 CGEvent 转换为 NSEvent?

我正在尝试使用 NSEvent(cgEvent: event) 将 CGEvent 转换为 NSEvent 以获取按键的字符,但我收到错误消息,称它是“无效事件”。我的代码和错误消息如下。任何帮助,将不胜感激。谢谢!

0 投票
1 回答
382 浏览

objective-c - 如何创建对角滚动的滚轮事件?

文档对此真的很吝啬,但从我在网上收集的信息来看,wheelCount 应该是 1 仅用于 Y,2 用于 YX,3 用于 YXZ。

据我了解,设置 wheelCount = 2 内部CGEventCreateScrollWheelEvent应将 x 和 y 滚动 10 像素,但下一段代码滚动,在某些应用程序(Chrome、Safari)中仅向上滚动 10 像素,而在其他应用程序(预览版、Firefox)中滚动两个轴:

链接到文档

更新:经过一番挖掘,似乎有些应用程序不知道如何解释多轮滚动并且只滚动 x 或 y。

这可以使用上面的代码或 Macbook 触控板轻松重现:

在预览和 Safari 中打开放大的图片。在预览中,在触控板上对角滑动 2 根手指将创建一个非常平滑的 x&y 滚动。在 Safari 或 Chrome 中执行相同操作只会导致 X 或 Y 被滚动,并且总体上会感觉损坏。

我发现了一个与此相关的Chrome 错误,该错误已以“无法修复”关闭。无法理解为什么。

关于为什么会发生这种情况的任何更好的解释都会很棒。

谢谢