在 Mac OS X 中模拟按键事件

Posted

技术标签:

【中文标题】在 Mac OS X 中模拟按键事件【英文标题】:Simulating key press events in Mac OS X 【发布时间】:2011-01-23 16:55:30 【问题描述】:

我正在编写一个应用程序,我需要在 Mac 上模拟按键事件,给定一个代表每个键的代码。看来我需要使用CGEventCreateKeyboardEvent 函数来创建事件。问题是这个函数需要一个 Mac 键码,而我拥有的是一个代表特定键的代码。因此,例如,我收到:

KEY_CODE_SHIFTKEY_CODE_A - 这些都是在某处定义的数字常量。

我需要将这些常量转换为CGKeyCode 值。

我当前的尝试使用类似于this SO question 的代码。问题是它只适用于可打印的字符。如果一切都失败了,我不会对转换进行硬编码,但这意味着我需要一个可能的 CGKeyCode 值表,但我还没有找到。

有什么想法吗?

【问题讨论】:

【参考方案1】:

这是模拟 Cmd-S 动作的代码:

CGKeyCode inputKeyCode = kVK_ANSI_S;
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, inputKeyCode, YES);
CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, inputKeyCode, NO);

CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown);
CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp);

CFRelease(saveCommandUp);
CFRelease(saveCommandDown);
CFRelease(source);

CGKeyCode 只不过是一个无符号整数:

typedef uint16_t CGKeyCode;  //From CGRemoteOperation.h

您真正的问题是将字符(可能是NSString)转换为键码。幸运的是,Shortcut Recorder 项目的代码可以在 SRKeyCodeTransformer.m 文件中执行此操作。它非常适合将字符串转换为键码并再次返回。

【讨论】:

那么在这个例子中,1CGKeyCode 是 S 的代码吗?此外,这是否仅适用于前台应用程序,或者如果它在后台运行,它会在整个会话中运行吗?谢谢 那么,假设我的应用程序在后台运行(只是作为一项服务)并且我前面有 Photoshop,我可以模拟按键,它会在 Photoshop 中看到吗?谢谢 @joec 是的,这就是会发生的事情 @Dave,你有使用 SRKeyCodeTransformer 的代码吗?我已将 ShortcutRecorder 框架添加到我的项目中,但不确定从这里去哪里。谢谢。 你可以使用 kVK_???常量而不是普通数字。谢谢sn-p。真的很有帮助。【参考方案2】:

以防万一有人需要 Swift 版本:

XCode 7.3 和 Swift 2.2:

let event1 = CGEventCreateKeyboardEvent(nil, 0x09, true); // cmd-v down
CGEventSetFlags(event1, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event1);

let event2 = CGEventCreateKeyboardEvent(nil, 0x09, false); // cmd-v up
CGEventSetFlags(event2, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event2);

上面的代码模拟 CMD-V 按下然后释放(AKA:粘贴)。

【讨论】:

以上是关于在 Mac OS X 中模拟按键事件的主要内容,如果未能解决你的问题,请参考以下文章

Mac:将按键事件发送到后台窗口

防止事件监视器 OS X 中出现错误“放克”声音

如何在 Qt 应用程序中生成按键事件到系统(win7)(模拟用户在键盘上按键)?

如何在python中运行另一个程序的python中模拟按键事件

将事件发布到 Qt GUI 线程以模拟按键

使用 Python for Linux 模拟按键事件