问题标签 [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 投票
1 回答
218 浏览

macos - CGEventTap 鼠标事件位置仅在以 root 用户身份运行应用程序时才可能覆盖?

我正在开发一个控制光标的 macOS 应用程序。我正在使用 CGEvent Tap 并且我正在向 CGEvents 添加一些算术以偏移最终的鼠标位置。尽管该应用程序在原则上按预期工作,但在某些情况下 - 更具体地说:当使用某些流行的插图软件并使用触控笔运行应用程序时 - 该应用程序会在其原始位置为鼠标产生一些闪烁的“幽灵”位置。好消息是,在以 root 用户身份登录运行应用程序时,可以解决此问题。我已经阅读了很多 SO 帖子,但这篇特别的帖子最好地解决了这个问题:

https://stackoverflow.com/a/9899901/5066660

如本文所述,问题可能是:

不幸的是,CGEventTapCreate() 文档说:只有以 root 用户身份运行的进程才能在 HID 事件进入窗口服务器的位置找到事件点击;对于其他用户,此函数返回 NULL。

好吧,该函数肯定不会返回 null,因为点击已生效。我还尝试了该函数的所有可能参数组合,但它们的作用都相同。在该职位的进一步下方,建议按以下方式解决该问题:

也许您可以将此功能分离到具有超级用户权限的单独进程中,让您的应用程序的其余部分处于正常用户模式?我相信还有一种方法可以为您的程序执行的特定操作请求 root 权限。

现在,如果这是一个可能的解决方案,我很乐意实施它!所以我的问题是:如何?我偶然发现运行具有提升权限的脚本,但不仅仅是 CoreGraphics 代码,例如 CGEventTap。这可能吗?任何人都可以给我一个如何实现这一点的例子,或者任何其他解决问题的方法吗?

欢迎大家帮忙,非常感谢。

0 投票
1 回答
1461 浏览

swift - 如何在 Swift 应用程序启动后发布 Quartz 事件?

我正在编写一个简单的 Cocoa 应用程序,该应用程序将从 AppleScript 启动,只是为了将 Quartz 事件发布到另一个应用程序。

不需要用户界面,因此我从 Interface Builder 中删除了窗口,并从 Application Delegate 中删除了它的出口。postClickEvent()我从方法中调用私有方法applicationDidFinishLaunching(_:)。我用 nil mouseEventSource at初始化leftMouseDown和CGEvents并将它们发布在 location 。leftMouseUpmouseCursorPosition (x: 0, y: 0)cghidEventTap

我希望该应用程序在启动后立即单击左上角并打开 Apple 菜单,但它没有发生。

我可以想到几种可能的解决方案。

  • 在调试器中运行的应用程序可能需要发布低级用户输入事件的权限。应用程序是否需要获得发布 Quartz 事件的权限?
  • 该方法applicationDidFinishLaunching(_:)由默认通知中心在应用程序启动和初始化之后但在收到第一个事件之前发送。也许 postClickEvent()应该从 Application Delegate 的另一个方法调用?
  • 这些事件在初始化时可能需要一个事件源。但是为三个可能的事件源状态 ID 中的任何一个传递初始化的init(stateID:)事件源都不会改变它。
  • 事件可以在应用程序在全屏 Xcode 后获得焦点时发布,太早而无法单击 Apple 菜单项。但是让线程休眠 10 秒并不会改变它。
0 投票
0 回答
682 浏览

objective-c - 在 OS X 上观察模拟的键盘/鼠标事件

是否可以在 macOS 应用程序中观察模拟(非物理)键盘/鼠标事件?

我编写了不同的代码来模拟键盘按钮按下。

1 示例:斯威夫特

2 示例:Obj-c / C++

由于 Apple 删除了处理键盘按下的访问权限,因此如果 macOS 应用程序在后台,则没有在设置中启用可访问性,例如这样的 api:

现在不起作用。

我发现唯一可行的解​​决方案是 IOKit,低级 api https://stackoverflow.com/a/39834889/7141905,即使没有启用应用程序的可访问性,它也会监听键盘/鼠标事件。

但是这两种方法都不能观察/捕捉模拟键盘按下。它只能观察来自用户输入的物理事件。Carbon Framework 也不适合我的情况。

有关可访问性要求的更多信息:https ://github.com/KonsomeJona/OctoMouse#why-is-the-keystrokes-counter-not-working

0 投票
1 回答
727 浏览

swift - 以正确的方式创建 CGEvent 点击

我正在尝试学习如何使用 SO 和其他地方的示例创建 CGEvent 水龙头。

我知道如何使用以下方法创建事件点击:

之后我跑

我在网上找到的一些(但不是所有)示例还添加了以下两行

有人可以简要解释一下添加最后两行是否有用/何时有用/推荐?

0 投票
0 回答
54 浏览

objective-c - 等待程序化按键处理

有人发布了一段代码,用于以编程方式按键:

这不是同步的。确保按键已被处理的正确方法是什么?

我想过使用随后的虚拟按键,但我想所有的组合键都可以使用。我的目标是以编程方式在当前活动的应用程序中复制/粘贴数据,而不使用辅助功能编程。

0 投票
1 回答
201 浏览

swift - CGEventTap 的 Xcode 项目设置?

前段时间,我创建了一个非常简单的 Xcode 项目来测试 CGEventTap,当我从 Xcode 运行时它工作得非常好。代码在底部。

但是,如果我在 Xcode 上创建一个新项目,粘贴下面完全相同的代码,然后从 Xcode 运行,我会得到“无法创建事件点击”。

为了让 CGEventTap 工作,我需要更改项目设置吗?我什至尝试将 info.plist 从旧测试项目复制并粘贴到新项目。

我很困惑。谢谢您的帮助!

0 投票
1 回答
103 浏览

objective-c - (Mac) 模拟键盘快捷键 - 箭头键不起作用

我正在尝试使用 Quartz Event Services 以编程方式触发键盘快捷键:

如果您使用的不是箭头键,则此代码可用于触发系统功能。但如果您确实使用箭头键,代码只会让您的光标移动。

例如,使用此代码触发 command-space(0x31, kCGEventFlagMaskCommand)会成功调出 Spotlight,但如果您将 Spotlight 映射到 command-left_arrow,然后使用此代码触发 command-left_arrow,它只会使光标跳转到行首。


值得注意的是,当我尝试触发包含箭头键的系统快捷方式时,Apple Script 的行为方式完全相同。

有解决方法吗?

谢谢你的帮助,我很感激。

0 投票
1 回答
83 浏览

objective-c - (Mac) 创建键盘事件会导致内存泄漏

每次我使用 Quartz Event Services 创建键盘事件时,我的应用程序的内存使用量都会永久增加。

以下是无限循环内有问题的代码:

Instruments.app说没有内存泄漏...

这里有什么问题?

谢谢您的帮助!

0 投票
0 回答
88 浏览

objective-c - 将击键事件“粘贴”发送到特定的应用程序 Mac

我正在使用代码在 MacOS 上使用碳模拟“粘贴”到最前面的应用程序。现在,我需要对不在最前面的特定应用程序执行此操作。到目前为止,我使用 PostToPsn 使用此代码:

它只使用一个字母,但是当与命令组合时,它根本不起作用。

0 投票
1 回答
843 浏览

objective-c - CGEventTapCreate 在 macOS Mojave 中返回 null

我完全被多年来一直在工作的逻辑所困扰。我正在使用它在应用程序处于后台时收听键盘事件(热键)。

代码没有改变,这已经工作了很长时间,直到最新的 mojave 更新。我该如何解决这个问题的原因?有谁知道我怎样才能让它再次工作?