我正在编写一个应用程序,我需要在Mac上模拟按键事件,并给出代表每个键的代码。我似乎需要使用CGEventCreateKeyboardEvent
函数来创建事件。问题是这个功能需要Mac键码,而我所拥有的是代表特定键的代码。所以,例如,我收到:
KEY_CODE_SHIFT
或KEY_CODE_A
- 这些都是在某处定义的数字常量。
我需要将这些常量转换为CGKeyCode
值。
我当前的尝试使用类似于this SO question的代码。问题是它只适用于可打印字符。如果所有其他方法都失败了,我就不会对转换进行硬编码,但这意味着我需要一个可能的CGKeyCode值表,这是我还没有找到的。
有什么想法吗?
答案 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:粘贴)。