在 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_SHIFT
或 KEY_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
文件中执行此操作。它非常适合将字符串转换为键码并再次返回。
【讨论】:
那么在这个例子中,1
的 CGKeyCode
是 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 中模拟按键事件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt 应用程序中生成按键事件到系统(win7)(模拟用户在键盘上按键)?