代码之家  ›  专栏  ›  技术社区  ›  Thomi

在Mac OS X中模拟按键事件

  •  13
  • Thomi  · 技术社区  · 16 年前

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

    KEY_CODE_SHIFT 或 KEY_CODE_A -这两个都是在某个地方定义的数值常量。

    我需要把这些常数变成 CGKeyCode 价值观。

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

    有什么想法吗?

    2 回复  |  直到 8 年前
        1
  •  24
  •   pkamb santoshIOS    8 年前

    下面是模拟 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 文件。它非常适合将字符串转换为键代码,然后再转换回来。

        2
  •  2
  •   Tyler Liu    10 年前

    以防有人需要快速版本:

    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(又名:粘贴)。