0

いくつかのタスクを自動化しようとしています (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 がある理由は、テスト目的のためです (一度だけ送信する必要があります)。プログラムがループしている間に、アプリを一番前にアクティブにすると、イベントは正常に機能します。

私は何を間違っていますか?バックグラウンドで動作する方法はありますか?ありがとう。

4

2 に答える 2

1

キーボードイベントを最前面のアプリケーションに投稿するためのより良い方法は次のとおりです。

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

CGEventPostを使用すると、イベントが投稿される場所を判別できます。最近、このコードを使用して、誰かが私のラップトップ上のPPTプレゼンテーションをリモートで制御できるようにしました。(文字124は右矢印キーです。)

イベントを投稿した後、イベントを解放する必要があることに注意してください。

CGEventPostToPSNを使用して、特定のアプリ(フロントアプリではないなど)に送信できます。

于 2011-05-18T17:34:17.513 に答える