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

objective-c - 虚拟按键进入错误的应用程序

我有以下代码可以将虚拟按键发送到给定 pid 的进程

正如预期的那样,我希望立即发送按键的过程出现在前面。但问题是,在我的应用程序出现在前面之前,第一个按键将进入前面的应用程序。测试时,[app isActive]第一次返回 false。在第一个键之后,一切顺利。

为什么会这样?即使我在将我的流程推向前台后发布了关键事件。

0 投票
1 回答
1456 浏览

xcode - CGEventTapCreate 和 CFMachPortCreateRunLoopSource 失败 EXC_BAD_ACCESS

我正在尝试利用 OSX 的 HID 事件。我找到了一个片段来测试它。但是,我的代码似乎总是以 EXC_BAD_ACCESS 失败CFMachPortCreateRunLoopSource。似乎downEventTap是空的。阅读文档告诉我这需要在主线程上运行,我很确定我在主线程上,并且将内容包装起来 dispatch_async(dispatch_get_main_queue(), ^{仍然给我 null。我正在从应用程序调用监听didFinishLaunching并添加

这就是我认为创建事件点击的方式:

0 投票
2 回答
916 浏览

macos - Mavericks+ 中的 CGEventTapCreateForPSN(不推荐使用 GetCurrentProcess)

我正在使用CGEventTapCreateForPSN为我的应用程序捕获和过滤密钥。我对拦截其他应用程序的事件不感兴趣。我很确定事件点击对于我的目的来说太重了,但我一直无法找到更好的方法,并且使用事件点击有效。

具体来说,这段代码做了我想要的。

而且我的回调处理得很好,事件仅从当前应用程序中截获。

不幸的是,从 10.9 开始,所有获取电流的方法ProcessSerialNumber都已被弃用。有一种旧的标准方法可以ProcessSerialNumber在同一进程中传递给其他例程,通过这个初始化......

但这在调用时不起作用CGEventTapCreateForPSN。头文件 docs 表明了这一点,以下代码片段NULL作为确认返回。

我可以使用CGEventTapCreate,但它会点击整个主机,然后我需要过滤任何未定向到我的应用程序的东西,而且它CGEventTapProxy是不透明的,我不知道如何使用它来确定它是否是我的应用程序。

我已经验证过不推荐使用的代码仍然有效,但 Apple 可以随时决定将其删除。那么,有没有人知道我应该如何继续调用CGEventTapCreateForPSN小牛队及其他球队?

谢谢!


更新

在 10.11(我认为那是 El Capitan)中,添加了一个新功能。虽然它的文档为零,但它的签名几乎与CGEventTapCreateForPSN.

因此,不需要弃用的函数,因为 PID 可以用作第一个参数。

0 投票
1 回答
110 浏览

objective-c - NSWindow 在模拟鼠标按下事件时冻结

收到鼠标按下事件后,我NSWindow的被冻结了。我无法捕获 Xcode 中挂起的线程。我正在使用以下代码来模拟鼠标事件:

我该如何解决这个问题?

0 投票
3 回答
900 浏览

objective-c - 在 OS X 中以编程方式模拟/切换 CAPS LOCK

我看过很多关于这个主题的帖子。但是在任何地方都没有找到明确的答案。

有没有办法在 Objective-C 或 C 代码中切换 CAPS LOCK?我不是在寻找使用 X11 库的解决方案。我不关心 LED 的开/关状态。但只是 CAPS LOCK 的功能(更改字母的大小写并在数字键上打印特殊字符)。

为什么 CGEvent 不像其他键那样支持这种方式?

0 投票
1 回答
5096 浏览

swift - 你如何在 Swift 中使用 CGEventTapCreate?

有没有人设法让这个功能在 Swift 中工作?

这是去年的参考 SO 帖子:Using CGEventTapCreate Trouble with parameters in Swift

苹果文档:https ://developer.apple.com/library/prerelease/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventTapCreate

以下是 CGEventTapCallBack 的定义方式:

这是我编写块的方式:

然后我用回调参数调用了 CGEventTapCreateunsafeBitCast(eventTapCallBackBlock, CGEventTapCallBack.self)

我得到了一个有效的CFMachPortRef回复,但在运行时我在第一个事件上得到了访问冲突异常。在当前的发布状态下,“似乎”我已经接近了一个快速的解决方案。

使用 Xcode 6.4 版

0 投票
0 回答
141 浏览

cocoa - 在 Mac 上截取功能键笔划

我想拦截 MacOS 中的功能键笔划,而不是 F x键,而是特别是音量增大/减小和静音。

显然,这应该以全局方式完成,而不仅仅是当我的程序位于最前面时。

我读到这可以使用CGEventTap来实现,但它需要为应用程序启用root 权限或辅助设备访问权限。

VLC 使用 Back/Playback/Next 功能键执行此操作,如果它正在播放它完全覆盖 iTunes 控制。 它在没有 root 权限甚至启用辅助设备访问的情况下也能做到这一点。

任何想法?

0 投票
1 回答
325 浏览

objective-c - CGEventRef KeyHandler - Xcode - Mac

所以我有一个应用程序,当你按下键盘顶部的数字时,它通常会输入符号。但是使用该应用程序,它会键入数字。

但是如果我在 xcode 中运行它,一切正常,但是当我在 xcode 之外打开应用程序时,它就不起作用了。

我有 mac os x 和 xcode 的最新更新。

视频:

https://youtu.be/67hRybEmJJY

有人可以帮我吗?

0 投票
1 回答
880 浏览

objective-c - 当 AXIsProcessTrusted() 为真时,重新启动 OS X 应用程序以执行 CGEventTapCreate()

我的应用程序的一项功能是检测keyDown事件并为某些特定键做一些事情。

所以,我CGEventTapCreate用来解决我的问题,我的代码是这样的:

另外,我处理流程信任,例如:

它将每秒调用一次,直到 processTrusted 为真。

然后奇怪的事情发生了:

当我在 Xcode 中运行应用程序并在 Privacy_Accessibility 中添加信任 Xcode 时,一切正常。但是当我将应用程序存档并运行Export as a Mac Application到我的桌面时,CGEventTapCreate() 就不起作用了。

之后我在 10.9 上以编程方式找到了这篇文章 Enable access for assistant devices,它注意到我需要在之后重新启动该应用程序AXIsTrustedProcess()

你知道,告诉用户自己重新启动应用程序并不是一个好主意。所以我尝试以编程方式重新启动它并将这些代码添加到if processTrusted {}

换句话说,当我勾选应用程序时Privacy_Accessibility,它会自动重新启动。

另一个奇怪的事情来了:

该应用程序真正终止并自动启动。但是当它完成重新启动时,应用程序的 Privacy_Accessibility 没有勾选。

这真的让我很困惑,我希望有人能告诉我处理流程信任和正确执行的CGEventTapCreate()正确方法。

谢谢!

0 投票
1 回答
1462 浏览

swift - Cocoa:在 CGEvent 中模拟 Command+Tab

我想Application Switcher在我的应用程序中进行模拟,我认为 CGEvent 可能可以做到这一点。

嗯,学习了一些CGEvent的基本信息后,就可以模拟按键了Command + Tab。但是应用程序切换器窗口只是闪烁并立即切换到另一个应用程序。

我意识到我需要hold使用 Command 键并按 Tab 键来选择应用程序。所以,这是我的代码:

但它不起作用!有任何想法吗?谢谢!