編集 - これについて多くの意見が得られないため、ここにスキニーがあります。キーボード イベントを PSN に投稿しています。次に、別のウィンドウに切り替えて、さらにいくつかのイベントを投稿し (今回は tat セッション レベル)、最初のウィンドウに戻ります。PSN への投稿を再開しても、何も起こりません。マウスまたはスクロール ホイールを動かすまで。これはなぜですか? また、どうすれば回避できますか (修正しない場合)?
オリジナル - いくつかのキーボード イベントを PSN に投稿するループを設定すると、最初の起動時以外は正常に動作することがわかりました。イベントは、マウスで手動で何かをしたときにのみ投稿されるようです-わずかに動かしただけでも。詳細はこちらです。
外部アプリケーションにはテキスト行のリスト ボックスがあり、コピー コマンドを投稿して (そしてペーストボードをチェックして) 読んでいます。残念ながら、これがこのテキストを取得する唯一の方法です。
ときどき、アプリケーションがリストからフォーカスを外しますが、これは私が検出できます。これが発生した場合、フォーカスを戻す最も確実な方法は、マウス イベントを送信してリストの真上にあるテキスト フィールドをクリックし、「タブ」キーボード イベントを送信してフォーカスをリストに移動することです。
そのため、起動時にループが正常に実行され、リストを下にスクロールしてテキストをコピーします。フォーカスが移動すると、それが正常に検出され、イベントが送信されてフォーカスがリストに戻ります。しかし、何も起こらないようです。ループはフォーカスが変更されたことを検出し続けますが、マウスを動かしたときにのみイベントが機能します。または、スクロール ホイールを使用することもできます。変。
これが初めて発生すると、問題なく動作します。フォーカスが移動するたびに、何もしなくても PSN イベントが元に戻ります。
ループで実行されるコードは次のとおりです-動作することが確認されています:
//copy to pasteboard - CMD-V
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventSetFlags(e3, kCGEventFlagMaskCommand);
CGEventPostToPSN(&psn, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPostToPSN(&psn, e4);
CFRelease(e4);
//move cursor down
e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, true);
CGEventPostToPSN(&psn, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, false);
CGEventPostToPSN(&psn, e2);
CFRelease(e2);
そして、ここでフォーカスを切り替え、これも機能します (最初に必要な場合を除く)。
//click in text input box - point is derived earlier
e6 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, 0);
CGEventPostToPSN(&psn, e6);
CFRelease(e6);
e7 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, 0);
CGEventPostToPSN(&psn, e7);
CFRelease(e7);
//press tab key to move to chat log table
CGEventRef e = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, true);
//CGEventPost(kCGSessionEventTap, e);
CGEventPostToPSN(&psn, e);
CFRelease(e);
CGEventRef e11 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, false);
CGEventPostToPSN(&psn, e11);
CFRelease(e11);