CGEventPost - 模拟键盘事件时可能出现错误?

2024-03-11

我有一段非常简单的代码,旨在模拟键盘事件。下面的简单示例应输入“Cz” - 按下shift键,按下c键,按下c键,然后按下shift键。然后 z 键向下和向上。

但有时顺序似乎会变得混乱。当我创建一个计时器每秒调用此例程时,输出应该是 CzCzCzCz...但是这是我得到的:

CZcZCZCzczCzczCzczCZCZCzCz

我将再次运行它:

CzCzCzCzCZCzCZCzCZCzCZCzCZCzCzCz

不同的。同样是错误的。

代码:

e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, true);
CGEventPost(kCGSessionEventTap, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventPost(kCGSessionEventTap, e2);
CFRelease(e2);
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPost(kCGSessionEventTap, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, false);
CGEventPost(kCGSessionEventTap, e4);
CFRelease(e4);

e7 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true);
CGEventPost(kCGSessionEventTap, e7);
CFRelease(e7);
e8 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false);
CGEventPost(kCGSessionEventTap, e8);
CFRelease(e8);

在如何实现 Shift 键的 keydown 和 keyup 方面,我是否遗漏了什么?我认为这可能是一个错误 - 我应该在哪里报告它?


我找到了一种可靠的方法来发布修改后的键盘事件 - 它没有遵循Apple文档中的示例(不起作用),但似乎有意义,最重要的是,有效。

您需要在按键上设置修饰符标志,而不是发送“shift key down”和“shift key up”消息(按照文档中的说明)。以下是如何输出大写 Z。

CGEventRef event1, event2;
event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true);//'z' keydown event
CGEventSetFlags(event1, kCGEventFlagMaskShift);//set shift key down for above event
CGEventPost(kCGSessionEventTap, event1);//post event

然后,我释放“z”键以确保完整性(也将移位标志设置为打开,但不确定这是否正确)。

event2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false);
CGEventSetFlags(event2, kCGEventFlagMaskShift);
CGEventPost(kCGSessionEventTap, event2);

最后(奇怪的是)您确实需要发送 Shift 键的“key up”事件:

  e5 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, false);
CGEventPost(kCGSessionEventTap, e5);

完成活动后,不要忘记发布它们。

我希望这对某人有用 - 我花了很长时间才让它发挥作用。

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

CGEventPost - 模拟键盘事件时可能出现错误? 的相关文章

  • 为什么 WebView 中的 dataWithPDFInsideRect 不能在 Mavericks 上创建高质量的 PDF?

    Run 示例项目 https github com tvarghese TestWebView并观察桌面上生成的输出 PDF 名为保存网页 pdf 粘贴感兴趣的代码片段 NSURL url NSBundle mainBundle URLFo
  • Mac OS X 中 Bash 脚本中的 SFTP 命令

    我需要使用 SFTP 和 SSH 从 Mac 主机将文本文件传输到远程 PC freeSSH 这两个连接在本地网络中 那么有没有办法从 Bash 脚本内部运行 SFTP 命令 使用提供的用户名和密码 我已经尝试过一些脚本expect 但我没
  • OSX Swift 在默认浏览器中打开 URL

    如何使用 Swift 作为编程语言和 OSX 作为平台在系统默认浏览器中打开 URL 我发现了很多UIApplication like UIApplication sharedApplication openURL NSURL string
  • 如何从 MacOS X Dock 启动脚本?

    我知道我可以将应用程序固定到扩展坞并从那里启动它们 但是 有没有办法将不是 MacOS 意义上的 应用程序 的程序 例如 bash 脚本 固定到扩展坞上 您可以将任何文件拖到 Dock 的右侧栏 垃圾箱和文件夹所在的位置 然后单击它来执行它
  • 升级到 5.4 但“php -v”仍然返回旧版本

    我使用的是 OSX Lion 10 7 5 正如建议的如何在 Mac OS X 中升级 PHP https stackoverflow com questions 2526085 how do i upgrade php in mac os
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • 为什么 Mac OS 上的 C 运行时允许预组合和分解的 UTF-8?

    所以我们都知道 Mac OS 上的文件系统具有使用完全分解的 UTF 8 的古怪功能 如果您调用 POSIX API 例如realpath 例如 您将从 Mac OS 返回这样一个完全分解的 UTF 8 字符串 当使用像这样的 API 时f
  • 分段错误:当我运行 Pygame 时为 11

    有人问过类似的问题here https stackoverflow com questions 34278488 pygame display causing segmentation fault 11 但没有得到答复 我有 Python
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 如何在 Mac 上设置默认 shell,例如钓鱼? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不喜欢重新输入fish每次我启动终端时 我想Fish https en wikipedia org wiki Fish Unix she
  • 如果加载 dylib,垃圾收集工作队列会崩溃

    我们正在将应用程序从 10 6 移植到 10 8 我正在查看我们在应用程序中加载的 dylib 我面临着非常不寻常的崩溃垃圾收集工作队列并附有以下消息 malloc Thread suspend unable to suspend a th
  • 从 Java 执行 .app 文件夹?

    有没有一种合理的方法可以直接从 Java 执行 app 目录 而不是深入查找二进制文件 我有一个带有一些首选项的应用程序 其中包括用于打开各种内容的外部程序 如果在 OSX 上用户可以只选择 app 文件夹 那就太好了 我可以查找 app
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • viewController 中的 Sprite 粒子系统动画

    I create a macOS single window application and add a Sprite Particle System file with template Stars and the visual effe
  • dyld:惰性符号绑定失败

    当我尝试运行时遇到一个奇怪的错误gatsby develop在新创建的 gatsby 项目中 这不应该与 gatsby js 静态站点生成器 有任何关系 因为我在不同的场合也遇到了相同的错误 当我跑步时gatsby develop在我的一个
  • 在 XCode 7.0.1 中设置 VTK 6.1

    所以 我遇到了问题VTK 可视化工具包 http www vtk org在 Mac OSX 上工作 特别是让它在XCode https developer apple com xcode 我让它工作并将在下面发布这个问题的答案 截至 201
  • 如何在不卸载应用程序的情况下删除木桶?

    我最近安装了一个带有 homebrew cask 的应用程序 但我想自己处理它的更新 而不是通过brew cask upgrade 是否有命令或选项可以从本地列表中删除木桶而不卸载它 如果我使用brew cask remove or bre
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • 在 macOS 上为 MoviePy 安装 ffmpeg 失败并出现 SSL 错误

    我正在尝试编写一个 Python 程序 在 Mac OS 10 11 16 上使用 MoviePy 将 MP4 文件转换为 GIF 我用 import moviepy editor as mp 我收到一条错误消息 说我需要打电话imagei

随机推荐