在Mac OS X中模拟按键事件

Tho*_*omi 13 c++ keyboard macos cocoa macos-carbon

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

KEY_CODE_SHIFT或者KEY_CODE_A- 这些都是在某处定义的数字常量.

我需要采用这些常量并将它们转换为CGKeyCode值.

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

有任何想法吗?

Dav*_*ong 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);
Run Code Online (Sandbox Code Playgroud)

A CGKeyCode只不过是无符号整数:

typedef uint16_t CGKeyCode;  //From CGRemoteOperation.h
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以使用kVK _ ??? 常数而不是普通数字.谢谢你的代码片段.它确实有帮助. (3认同)

Tyl*_*ong 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);
Run Code Online (Sandbox Code Playgroud)

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