在Mac OS X中模拟按键事件

时间:2010-03-04 14:13:59

标签: c++ cocoa macos keyboard macos-carbon

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

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:24)

这是模拟 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 :(得分: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:粘贴)。