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

时间:2012-02-16 20:39:59

标签: objective-c macos cocoa

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

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

刚刚学会here,AppleScript可以这样做:

tell application "TextEdit"
    activate

    tell application "System Events"
        keystroke "f" using {command down}
    end tell
end tell

问:我如何使用ObjC / cocoa?

更新2012-02-18 - Nicks提案已增强

根据以下Nick代码,以下是最终解决方案:

// 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);

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

1 个答案:

答案 0 :(得分: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);

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