为最前面的应用程序生成键盘事件

Ste*_*eAp 6 macos cocoa objective-c

在Mac OS/Cocoa中,我可以以透明的方式为最前面的应用程序合成键盘条目 - 字符串吗?

更确切地说,我不想发送特殊字符或控制序列.我唯一需要的是发送标准字符.

刚刚在这里学到,AppleScript可以像这样做:

tell application "TextEdit"
    activate

    tell application "System Events"
        keystroke "f" using {command down}
    end tell
end tell
Run Code Online (Sandbox Code Playgroud)

问:我如何使用ObjC/cocoa做到这一点?

更新2012-02-18 - 尼克斯提案得到加强

根据下面尼克的代码,这是最终的解决方案:

// First, get the PSN of the currently front app
ProcessSerialNumber psn;
GetFrontProcess( &psn );

// make some key events
CGEventRef keyup, keydown;
keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, true);
keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, false);

// forward them to the frontmost app
CGEventPostToPSN (&psn, keydown); 
CGEventPostToPSN (&psn, keyup); 

// and finally behave friendly
CFRelease(keydown);
CFRelease(keyup);
Run Code Online (Sandbox Code Playgroud)

使用此方法,单击非激活面板的按钮可将事件定向到实际的前端应用程序.完全是我想做的.

Nic*_*ick 10

当然,您需要使用CGEventCreateKeyboardEvent来创建键盘事件,然后将其发布为:

    CGEventRef keyup, keydown;
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, true);
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, false);

    CGEventPost(kCGHIDEventTap, keydown);
    CGEventPost(kCGHIDEventTap, keyup);
    CFRelease(keydown);
    CFRelease(keyup);
Run Code Online (Sandbox Code Playgroud)

它比AppleScript有点复杂,但它可以解决问题.你必须明确地发布的keydown,然后keyup事件.有关Quartz Event Services Reference的更多信息.