Mac:将关键事件发送到后台窗口

时间:2014-02-19 11:21:19

标签: macos keyboard

我正在使用Quartz Event Services向应用程序发送关键命令,但似乎它被设计为仅发送到每个应用程序的最前面的窗口。在Windows中,您可以使用SendKeys API将键事件发送到特定窗口。

我知道您可以使用AppleScripts定位特定的窗口并发送关键命令,而无需将该窗口带到该应用程序的前台,但想知道是否有办法在C / Objective-C中以编程方式执行此操作。似乎有功能,但无法找到API的任何文档。


****注意**:这两个窗口都不是我的应用程序创建的窗口,可能两个应用程序都归同一个进程所有*


示例: 下面,我可以将命令发送到前景窗口(The Up-Goer Five Text Editor),但不能将命令发送到蓝色背景窗口(标准文本编辑器),而不先将蓝色窗口置于前面。你会认为Window编程方式很快,但它实际上非常引人注目。我如何做到这一点,以便在Windows之间复制击键?

enter image description here

1 个答案:

答案 0 :(得分:8)

您可以使用CGEventPostToPSN执行此操作。 此示例向下发送'Q'键/键到TextEdit,而它在后台。

// action when a button of the foreground application is clicked
// send 'Q' key down/key up to TextEdit
-(IBAction)sendQKeyEventToTextEdit:(id)sender
{
    // check if textEdit is running
     if ([[NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.TextEdit"] count])
    {
        // get TextEdit.app pid
        pid_t pid = [(NSRunningApplication*)[[NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.TextEdit"] objectAtIndex:0] processIdentifier];

        CGEventRef qKeyUp;
        CGEventRef qKeyDown;
        ProcessSerialNumber psn;

        // get TextEdit.app PSN
        OSStatus err = GetProcessForPID(pid, &psn);
        if (err == noErr)
        {
            // see HIToolbox/Events.h for key codes
            qKeyDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)0x0C, true);
            qKeyUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)0x0C, false);

            CGEventPostToPSN(&psn, qKeyDown);
            CGEventPostToPSN(&psn, qKeyUp);

            CFRelease(qKeyDown);
            CFRelease(qKeyUp);
        }
    }
}