macos - 模拟系统范围热键的按键

标签 macos cocoa

我需要在 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 + spacecmd + 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/

相关文章:

objective-c - NSNotification 和 NSEvent 的区别

objective-c - UIRequiredDeviceCapabilities 等同于 Mac App Store?

objective-c - NSImageView 绘制不正确

macos - 如何在 MacOS 上的 Araxis Merge 中更改字体大小以放大和缩小?

java - 使用 Java 代码在 Mac 上打开下载的 JAR 文件

iphone - 代码签名证书、.p12 文件和 mobileprovisions 的命令行安装

java - 有没有办法在 OSX Lion 上使用 Java 6 重新启用 javaws?

swift - 代码 : Swift strange behaviour and errors

cocoa - 获取 Mac UI 中当前选定的项目

objective-c - 在 Cocoa 中同时显示多个工具提示