我需要将键组合 ^⌘C 发送到具有包标识符com.company.app的后台应用程序中。然后,该键组合应激活该应用程序中的菜单项。
不幸的是,我不知道如何做到这一点。一些研究指向了使用CGEventPostToPSN()的NSEvent和CGEvent API,但是由于我不知道如何设置键组合,因此我无法正确地使用它。即使所需的应用程序是活动的,使用我创建的事件也似乎无法使用CGEventPost()正常工作。
以下是我最终编写但不起作用的代码:
不幸的是,我不知道如何做到这一点。一些研究指向了使用CGEventPostToPSN()的NSEvent和CGEvent API,但是由于我不知道如何设置键组合,因此我无法正确地使用它。即使所需的应用程序是活动的,使用我创建的事件也似乎无法使用CGEventPost()正常工作。
以下是我最终编写但不起作用的代码:
CGWindowID windowNumber;
NSEvent *event = [NSEvent keyEventWithType:NSKeyUp
location:NSZeroPoint
modifierFlags:(NSControlKeyMask | NSCommandKeyMask)
timestamp:[[NSProcessInfo processInfo] systemUptime]
windowNumber:windowNumber
context:[NSGraphicsContext currentContext]
characters:@"c"
charactersIgnoringModifiers:@"c"
isARepeat:NO
keyCode:8];
CGEventRef eventRef = [event CGEvent];
现在我该如何处理这个事件呢?为什么CGEventPost()
没有NSEvent
的等效物呢?激活菜单项是否有更简单的方法,而不是发送一个事件?我可以轻松地获得NSRunningApplication
的实例,但没有合适的API来完成我的任务。
更新: 我已经成功了:
- (void) postFakedKeyboardEventForCopyScreenToPasteboardToPSN:(ProcessSerialNumber)psn {
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
CGEventRef keyDownEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, true);
CGEventSetFlags(keyDownEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
CGEventRef keyUpEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, false);
CGEventSetFlags(keyUpEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
CFRelease(source);
CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent);
}
...
OSStatus err = noErr;
ProcessSerialNumber psn;
err = GetProcessForPID([simulator processIdentifier], &psn);
if (err == noErr)
[self postFakedKeyboardEventForCopyScreenToPasteboardToPSN:psn];
postFakedKeyboardEventForCopyScreenToPasteboardToPSN
! - tomsmeding