问题标签 [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 回答
2241 浏览

events - 事件点击:使用 CGEventPost、kCGSessionEventTap、kCGAnnotatedSessionEventTap、CGEventTapPostEvent 改变结果

从事件水龙头发布事件时,我遇到了一个棘手的问题。我在 kCGHIDEventTap 上点击 NSSystemDefined,然后用一个新事件替换该事件。我遇到的问题是,根据我发布事件的方式,它只能被某些应用程序看到。我的测试应用程序是 Opera、Firefox、Quicksilver 和 Xcode。以下是我在事件点击回调中尝试的不同技术以及结果。我期待每个应用程序采取行动(“正确响应”);“系统哔”表示没有任何东西绑定到那个键的系统声音。

  1. 创建一个新事件,并从回调中返回它。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  2. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,返回 null。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  3. 创建一个新事件,使用 CGEventPost 发布到 kCGAnnotatedSessionEventTap,返回 null。Opera:正确响应,Firefox:正确响应,Quicksilver:无响应/系统哔声,Xcode:无响应/系统哔声

  4. 创建一个新事件,使用 CGEventTapPostEvent 发布,返回 null。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  5. 创建一个新事件,使用 CGEventPost 发布到 kCGSessionEventTap,并返回新事件。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

  6. 创建一个新事件,使用 CGEventPost 发布到 kCGAnnotatedSessionEventTap,并返回新事件。Opera:正确响应和系统哔声,Firefox:正确响应和系统哔声,Quicksilver:正确响应和系统哔声,Xcode:无响应/双系统哔声

  7. 创建一个新事件,使用 CGEventTapPostEvent 发布,并返回新事件。Opera:无响应/系统提示音,Firefox:无响应/系统提示音,Quicksilver:正确响应,Xcode:无响应/系统提示音

(6) 是最好的,但用户抱怨正确响应时额外的系统蜂鸣声,我猜这是来自事件的双重发布。我不确定其他组合可以尝试,或者在哪里寻找。任何人都可以提供任何指导吗?有没有什么方法可以同时从我的回调中返回事件并发布到带注释的水龙头而不做两者?

很抱歉这个冗长的问题;我一直在做很多实验。

提前致谢


更新:这是我用来创建事件点击的代码:

0 投票
2 回答
9750 浏览

objective-c - 使用 CGEventCreateMouseEvent() 执行双击

我正在使用以下代码来模拟鼠标点击:

我可以使用基本相同的代码通过更改进行控制单击(右键单击):

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

到他们各自的“权利”事件。该函数看起来像:

但是,双击呢?我尝试发送 2 次左键单击并连续两次调用 PostMouseEvent() 但没有运气。如何执行双击?

谢谢!

0 投票
2 回答
1321 浏览

macos - 如何将 CGEventKeyboardSetUnicodeString 与多个字符一起使用?

我正在尝试使用事件点击来创建一个 OS X 程序,该程序将侦听以音译形式输入的意第绪语并以希伯来语字符发布结果。我做了一个很短的程序来测试我必须做的一件事:http: //pastie.org/791398

照原样,程序成功地将每个键入的 'q' 替换为 'w':

但是如何发布一个多于一个字符的字符串呢?例如,如果有人键入“sh”,您可能必须发布一个退格键(删除单独为“s”发布的字符),然后发布对应于“sh”的字符。但是,此代码仅导致发布退格键:

如果这些是基本问题,我深表歉意;我已经阅读了我能找到的所有文档,但我可能还没有完全理解。我也有可能完全错误地处理这个问题。

0 投票
2 回答
1472 浏览

objective-c - 将 CGEvent 发布到 PSN 时的奇怪行为

编辑 - 对此没有太多投入,所以这里很瘦。我将键盘事件发布到 PSN。然后我切换到另一个窗口,发布更多事件(这次是会话级别)并切换回第一个窗口。当我再次开始在 PSN 上发帖时,什么也没有发生。直到我移动鼠标或滚轮。为什么会出现这种情况,我该如何解决(如果不解决)?

原创 - 如果我设置了一个循环将一些键盘事件发布到 PSN,我发现它工作正常,除了第一次启动时。该事件似乎仅在我手动使用鼠标执行某些操作时发布 - 即使只是稍微移动它。这是详细信息,如果他们有帮助的话。

一个外部应用程序有一个文本行列表框,我通过发布复制命令(并检查粘贴板)来阅读它。不幸的是,这是我获得此文本的唯一方法。

有时,应用程序会将焦点从列表中移开,我可以检测到。发生这种情况时,返回焦点最可靠的方法是发送鼠标事件以单击列表正上方的文本字段,然后发送“制表符”键盘事件以将焦点转移到列表上。

所以在启动时,循环运行良好,向下滚动列表并复制文本。当焦点移开时,它会被很好地检测到,并发送事件以将焦点移回列表。但似乎什么也没有发生。循环继续检测焦点已更改,但事件仅在我移动鼠标后才起作用。甚至只是使用滚轮。奇怪的。

一旦第一次发生这种情况,它就可以正常工作 - 每次焦点移动时,PSN 事件都会将其切换回来,而我根本不需要做任何事情。

这是在循环中运行的代码 - 验证为有效:

这是我切换焦点的地方,也可以工作(除非第一次需要):

0 投票
1 回答
1074 浏览

quartz-graphics - 无法使用 CGEventTap 阻止大写锁定

我正在使用 Quartz CGEventTap 试图全局拦截 capslock 按下并阻止它们(让它们做一些有用的事情)。我成功检测到 capslock 按下,但到目前为止还无法阻止它们。我的代码(源自这个stackoverflow 答案)是这样的:

如果我理解正确返回 NULL 应该有效地阻止按键传播。事实上,它也适用于“正常”的 keyup 和 -down 事件。但是不管怎样,大写锁定都会切换。任何想法为什么会这样?我是否做出了错误的假设?和/或我怎样才能以不同的方式做事来实现我的目标?

谢谢,

雷神

0 投票
1 回答
1113 浏览

macos - 桌面与 MacBook 上的 CGEventCreateKeyboardEvent

奥拉人,

再一次,我想从使用 SO 的人们共享的知识库中汲取灵感。

我为 OSX 编写了一个将关键事件发送到应用程序的小应用程序。我的目标是 OSX 10.5.x 和更新版本。但是,当我为 10.6.x 构建时也存在问题。一切正常,除非我只发送修饰键;Alt、Command、Control 和 Shift。

问题在于,在两台 MacBook 上,一旦测试人员使用鼠标移动光标或触摸触摸板,修改键的事件似乎就被清除了。

在安装了 XCode 的桌面上,一切正常。就像它应该的那样。在两个不同的 MacBook 上,会出现问题。桌面有一个标准的 101 键键盘和一个多键鼠标。
当鼠标连接到 MacBook 时,会使用带有滚轮的两键鼠标。但是,当没有连接外围设备并使用触摸板时,就会出现问题。

我期望发生的是修改键事件被发送到目标应用程序,用户使用鼠标/触摸板移动光标,按下鼠标/触摸板上的按钮和/或使用修饰键按下事件按下键盘上的键'积极的'。然后,当它们完成时,将发送修改键的键向上事件。

这是我发送按键事件的方式,本示例中的 Shift 键:

我已使用所有三个标志来创建事件源(kCGEventSourceStatePrivate、kCGEventSourceStateCombinedSessionState 和 kCGEventSourceStateHIDSystemState)。

我尝试使用事件源以及 null 作为第一个参数来创建键盘事件。

我已经尝试过在事件中使用和不使用适当的标志。

我尝试了发布活动的各种组合;kCGHIDEventTap、kCGSessionEventTap 和 kCGAnnotatedSessionEventTap。

为了完整起见,以下是我为 Shift 键发送向上事件的方式:

当测试人员触发修改键按下事件时,他们可以看到光标按预期变化。这让我知道目标应用程序正在处理事件。但是,一旦他们触摸鼠标或触摸板,光标就会变回标准光标,并且鼠标事件会被处理,就好像没有修改键事件处于活动状态一样。

我想知道我发送事件的方式是否有问题。我还想知道是否有另一种方法可以发送正在运行的修饰键事件。

抱歉,如果我说得太多了。我的借口是我只睡了几个小时。:P

谢谢

-isdi-

0 投票
1 回答
723 浏览

objective-c - 应用程序随机停止接收按键(CGEventTaps)

所以,我浪费了很多时间来创建这个非常酷的键盘宏应用程序。它工作得很好,唯一的问题是几分钟后,它就停止工作了。当我按下一个键时,它不再被调用。

我无法锁定它,但它总是需要至少 30 秒才能发生。通常它不会发生几分钟。到那时我会截获并发出许多事件。当它发生时,应用程序仍在运行。

这是我正在听的一个例子

和处理程序 -

另请注意,当我拦截一个事件(并返回该事件CGEventCreate(NULL))时,我通常使用以下代码发出我自己的一个或多个按键。请注意,KeyCmd 等只是普通常量的快捷方式。

谢谢!

0 投票
1 回答
889 浏览

cocoa - 如何使用 Quartz 事件处理鼠标点击?

我有一个CGEventTap并且我想观察和处理所有系统鼠标点击事件。检测鼠标点击事件很容易,但我不希望系统的其余部分处理某些点击。我不知道怎么做。

系统只发送低级事件,如、mouseUp等。当我收到一个事件时,我不知道它是否是鼠标点击的一部分,可能是一个拖动事件。我必须等待以下事件——如果是,我点击一下。但是,如果我想自己处理点击并防止它进入事件队列的其余部分,我不能简单地窃取事件,因为前一个事件已经发送。mouseDownmouseDraggedmouseDownmouseUpmouseUpmouseDown

我以为我可以延迟mouseDown事件并在收到相应的 之后才发送它mouseUp,但感觉不对,我不想mouseDown仅仅因为我的应用程序而延迟所有系统事件。我错过了什么吗?

0 投票
1 回答
1083 浏览

cocoa - CGEventTap 阻止应用程序输入

我正在尝试使用 CGCreateEventTap 来监视全局鼠标点击,但是当我这样做时,它似乎阻止了与我自己的应用程序的交互。其他正在运行的应用程序中的鼠标单击工作正常,但我自己的应用程序(即 DemoAppDelegate 应用程序)没有完全响应。我可以拖动应用程序的主窗口,但红色/黄色/绿色窗口按钮显示为灰色。DemoApp 的菜单也是不可点击的。

这对我来说似乎很奇怪,我一直无法弄清楚。使用事件水龙头的例子很少而且相差甚远,因此非常感谢任何建议。

0 投票
2 回答
686 浏览

macos - 未调用热键回调的事件 Tap(CFMachPortRef) 问题

我正在开发一个桌面应用程序,它通过热键支持其中一项功能。我正在使用 Event Tap 来实现这一点。

但是,有时(随机)不调用回调;热键不起作用,因此该功能似乎不起作用。

有人可以帮我找出这里的问题。

以下是代码片段: