CGKeyEvent Pasting работает с точками останова, но не без - PullRequest
1 голос
/ 05 июня 2011

Я много искал в StackOverflow по этой теме. И то, что я нашел до сих пор, было очень полезно. Но теперь я пришел к очень интересному факту.

В моем случае я прячу приложение через NSApp hide:self

Затем я добавляю символ в монтажную панель, а затем пытаюсь ввести его в переднем приложении через CGEvents. Мой код для этого выглядит следующим образом:

-(void)applicationDidHide:(NSNotification *)notification{
    stringToInsert = @"©";

    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    [pasteboard clearContents];
    NSArray *copiedObjects = [NSArray arrayWithObject:stringToInsert];
    [pasteboard writeObjects:copiedObjects];

    //Use CGEvents to "press" Cmd-V
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef pasteCommandDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)9, YES);
    CGEventSetFlags(pasteCommandDown, kCGEventFlagMaskCommand);
    CGEventRef pasteCommandUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)9, NO);

    CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandDown);
    CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandUp);

    CFRelease(pasteCommandUp);
    CFRelease(pasteCommandDown);
    CFRelease(source);

}

Моя проблема заключается в том, что он не хочет вставлять текст, когда я запускаю его из XCode без точек останова. Скорее, это делает характерного «макинтоша» макинтошом, если он не способен что-то сделать.

Но , если Я устанавливаю точку останова для самого метода, а затем прыгаю за строкой, он с любопытством вставляет ее в момент.

Извините за мой плохой английский и за, возможно, плохое форматирование текста, поскольку я новичок здесь в stackoverflow.

Если бы вы могли помочь, я был бы очень признателен!

1 Ответ

2 голосов
/ 05 июня 2011

Я видел это раньше, и я предполагаю, что события публикуются слишком быстро, чтобы система могла их обработать (поскольку она должна обрабатывать не более, скажем, 20 ключевых событий в секунду).Я предполагаю, что вставка чего-то вроде usleep(100000) (приостановка потока на 1/10 секунды) очень поможет.

...