【问题标题】:Simulating key press events in Mac OS X在 Mac OS X 中模拟按键事件
【发布时间】:2011-01-23 16:55:30
【问题描述】:

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

KEY_CODE_SHIFTKEY_CODE_A - 这些都是在某处定义的数字常量。

我需要将这些常量转换为CGKeyCode 值。

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

有什么想法吗?

【问题讨论】:

    标签: c++ cocoa macos keyboard macos-carbon


    【解决方案1】:

    这是模拟 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 文件中执行此操作。它非常适合将字符串转换为键码并再次返回。

    【讨论】:

    • 那么在这个例子中,1CGKeyCode 是 S 的代码吗?此外,这是否仅适用于前台应用程序,或者如果它在后台运行,它会在整个会话中运行吗?谢谢
    • 那么,假设我的应用程序在后台运行(只是作为一项服务)并且我前面有 Photoshop,我可以模拟按键,它会在 Photoshop 中看到吗?谢谢
    • @joec 是的,这就是会发生的事情
    • @Dave,你有使用 SRKeyCodeTransformer 的代码吗?我已将 ShortcutRecorder 框架添加到我的项目中,但不确定从这里去哪里。谢谢。
    • 你可以使用 kVK_???常量而不是普通数字。谢谢sn-p。真的很有帮助。
    【解决方案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:粘贴)。

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2012-03-21
      • 2015-04-09
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多