Отправить NSEVENT в фоновое приложение

Мне нужно отправить ключ 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];
7
задан Fabian Kreiser 15 September 2011 в 16:06
поделиться