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:将按键事件发送到后台窗口的主要内容,如果未能解决你的问题,请参考以下文章
如何在子窗口小部件下使用 eventfilter 来捕获自定义事件
如何在python中运行另一个程序的python中模拟按键事件