我正在使用Quartz Event Services向应用程序发送关键命令,但似乎它被设计为仅发送到每个应用程序的最前面的窗口。在Windows中,您可以使用SendKeys API将键事件发送到特定窗口。
我知道您可以使用AppleScripts定位特定的窗口并发送关键命令,而无需将该窗口带到该应用程序的前台,但想知道是否有办法在C / Objective-C中以编程方式执行此操作。似乎有功能,但无法找到API的任何文档。
****注意**:这两个窗口都不是我的应用程序创建的窗口,可能两个应用程序都归同一个进程所有*
示例: 下面,我可以将命令发送到前景窗口(The Up-Goer Five Text Editor),但不能将命令发送到蓝色背景窗口(标准文本编辑器),而不先将蓝色窗口置于前面。你会认为Window编程方式很快,但它实际上非常引人注目。我如何做到这一点,以便在Windows之间复制击键?
答案 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);
}
}
}