CGEvent NSKeyDown работает только в том случае, если приложение находится на первом месте? - PullRequest
0 голосов
/ 18 мая 2011

Я пытаюсь автоматизировать некоторые задачи (поддержка appleScript отсутствует), поэтому мне нужно использовать CGEvents и публиковать эти события. Щелчок мышью работает нормально, но NSKeyDown (ввод) работает, только если я нажимаю на приложение в доке (что делает его передним большинством приложений) ... Вот мой код:

   for (NSDictionary *dict in windowList) {
        NSLog(@"%@", dict);
        if ([[dict objectForKey:@"kCGWindowName"] isEqualToString:@"Some Window..."]) {
            WIDK = [[dict objectForKey:@"kCGWindowNumber"] intValue];
            break;
        };
    }


    CGEventRef CGEvent;
    NSEvent *customEvent;

    customEvent = [NSEvent keyEventWithType:NSKeyDown 
                                   location:NSZeroPoint 
                              modifierFlags:0 
                                  timestamp:1 
                               windowNumber:WIDK
                                    context:nil 
                                 characters:nil 
                charactersIgnoringModifiers:nil 
                                  isARepeat:NO 
                                    keyCode:36];

    CGEvent = [customEvent CGEvent];
    for (int i=0; i <5; i++) {
        sleep(3);
        CGEventPostToPSN(&psn, CGEvent);
        NSLog(@"posted the event");
    }

    CFRelease(eOne);

Причина, по которой у меня есть posteventtopsn в цикле, заключается в целях тестирования (мне просто нужно отправить его один раз). Пока программа находится в цикле, если я активирую свое приложение на переднем крае, событие работает нормально.

Что я делаю не так? Есть ли способ, которым он может работать, если он в фоновом режиме? Благодарю.

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Вот лучший способ опубликовать события клавиатуры в самом переднем приложении:

  CGEventRef a = CGEventCreateKeyboardEvent(NULL, 124, true);
  CGEventRef b = CGEventCreateKeyboardEvent(NULL, 124, false);
  CGEventPost(kCGHIDEventTap, a);
  CGEventPost(kCGHIDEventTap, b);

CGEventPost позволяет определить, где событие публикуется.Я недавно использовал этот код, чтобы позволить кому-то удаленно управлять презентацией PPT на моем ноутбуке.(Символ 124 - это клавиша со стрелкой вправо.)

Обратите внимание, что вы должны освободить событие после публикации.

Вы можете отправить в определенное приложение (например, не в переднее приложение), используяCGEventPostToPSN.

0 голосов
/ 19 марта 2014

Я думаю, это потому, что вы создаете NSEvent, используя "WIDK" для параметра windowNumber, а WIDK относится только к вашему приложению.

...