Мне нужно отправить ключ Combo ^ ⌘C в фоновое приложение с идентификатором пучка com.company.app
. Затем ключевой комбо должен активировать пункт меню в этом приложении.
К сожалению, я не знаю, как это сделать. Некоторые исследования указывали на ASEVENT и CGEVENT API, используя CGEVentposttopsn ()
, но я не смог заставить его правильно работать, так как я не знаю, как настроить клавишу комбо. 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];
Что я должен связать с этим событием сейчас? Почему нет NSEVENT
эквивалент для CGEVENTPOST ()
? Есть еще проще, чтобы активировать этот пункт меню, чем публиковать событие? Я могу легко получить экземпляр 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];