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

Posted

技术标签:

【中文标题】Mac:将按键事件发送到后台窗口【英文标题】:Mac: Send key event to background Window 【发布时间】:2014-03-19 16:40:42 【问题描述】:

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

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


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


示例: 下面,我可以将命令发送到前台窗口(The Up-Goer Five Text Editor),但不能发送到蓝色背景窗口(标准文本编辑器),而无需先将蓝色窗口置于前面。您会认为以编程方式切换窗口很快,但实际上非常明显。如何在窗口之间复制击键?

【问题讨论】:

【参考方案1】:

您可以使用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);
        
    

【讨论】:

添加了一个明确的例子。希望将事件发送到进程的特定窗口而不是特定进程。 @Jason 您是创建必须接收事件的应用程序,还是要使用任何应用程序来创建它? @Jason 所以,据我所知,没有公共 API 可以将事件发送到另一个进程的特定窗口(除非您自己创建了这个其他应用程序并使用 @987654324 实现了这个外部事件处理@),但您仍然可以从代码中使用 AppleScript,请参阅 NSAppleScript Class。

以上是关于Mac:将按键事件发送到后台窗口的主要内容,如果未能解决你的问题,请参考以下文章

android怎么实现后台对按键事件的监控

以编程方式触发 jsdom 窗口中的滚动或按键事件

如何在子窗口小部件下使用 eventfilter 来捕获自定义事件

如何在python中运行另一个程序的python中模拟按键事件

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听