13

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

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

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

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

有任何想法吗?

4

2 回答 2

25

这是模拟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);

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

typedef uint16_t CGKeyCode;  //From CGRemoteOperation.h

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

于 2010-03-04T15:07:20.060 回答
5

以防万一有人需要 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:粘贴)。

于 2016-07-27T16:00:45.433 回答