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

问题描述:

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

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

刚刚获悉here,即AppleScript的可以做的伎俩是这样的:

tell application "TextEdit" 
    activate 

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

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

更新2012-02-18 - 尼克斯建议增强

基于以下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); 

使用这种方法,在点击非激活面板的按钮将事件指向实际的前端应用程序。完全是我想要做的。

当然,你想用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,然后键入事件。更多信息请致电Quartz Event Services Reference

+0

谢谢!从来没有做过这么低的事情。 – SteAp 2012-02-18 00:39:59