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
文件中执行.它非常适合将字符串转换为键码然后再转换回来.
以防万一有人需要 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 按下然后释放(又名:粘贴)。