我需要在 OSX 中模拟击键。我是这样做的:
-(void)execute {
CGEventSourceRef sourceRef =
CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef keyPress = CGEventCreateKeyboardEvent (sourceRef, (CGKeyCode)keyCode, true);
CGEventRef keyUnpress = CGEventCreateKeyboardEvent (sourceRef, (CGKeyCode)keyCode, false);
CGEventSetFlags(keyPress, modifierFlags);
CGEventPost(kCGHIDEventTap, keyPress);
//unpressing the acualkey
CGEventPost(kCGHIDEventTap, keyUnpress);
CFRelease(keyPress);
CFRelease(keyUnpress);
CFRelease(sourceRef);
}
它适用于任何应用程序中的每个热键或简单击键,但不适用于系统范围的快捷键,例如用于启动 Spotlight 的 option + space 或 cmd + shift + 4 进行屏幕截图或 ctrl + ` 打开 iTerm2 窗口。
我尝试更改事件的来源和发布事件的位置,但没有帮助。有什么想法吗?
最佳答案
来自 CGEventCreateKeyboardEvent 的文档:
All keystrokes needed to generate a character must be entered, including modifier keys. For example, to produce a 'Z', the SHIFT key must be down, the 'z' key must go down, and then the SHIFT and 'z' key must be released:
因此,您不能仅使用选项修饰符按下并释放空格来触发选项空格;你必须按选项,按空格,释放空格,释放选项。
顺便说一句,opt-space 默认情况下不执行任何操作; cmd-space 是 Spotlight 搜索热键,cmd-opt-space 是 Spotlight 窗口热键。
所以,这段代码会弹出Spotlight搜索:
- (void)execute {
CGEventSourceRef src =
CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef cmdd = CGEventCreateKeyboardEvent(src, 0x38, true);
CGEventRef cmdu = CGEventCreateKeyboardEvent(src, 0x38, false);
CGEventRef spcd = CGEventCreateKeyboardEvent(src, 0x31, true);
CGEventRef spcu = CGEventCreateKeyboardEvent(src, 0x31, false);
CGEventSetFlags(spcd, kCGEventFlagMaskCommand);
CGEventSetFlags(spcu, kCGEventFlagMaskCommand);
CGEventTapLocation loc = kCGHIDEventTap; // kCGSessionEventTap also works
CGEventPost(loc, cmdd);
CGEventPost(loc, spcd);
CGEventPost(loc, spcu);
CGEventPost(loc, cmdu);
CFRelease(cmdd);
CFRelease(cmdu);
CFRelease(spcd);
CFRelease(spcu);
CFRelease(src);
}
关于macos - 模拟系统范围热键的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807487/