2

Windowsで使用される他のアプリケーションに関する情報を収集するための基礎となるプロセスが必要です。これはWAPIフックを使用して行われると思います。私がやりたいのは、Windowsがフォーカスをあるプログラムから別のプログラムに変更したことをプログラムが検出し、現在フォーカスがあるプログラムを教えてくれることです。

まず、Windowsが2つのアプリケーション間でフォーカスを交換するたびにトリガーされるイベントが必要です。これまでに見つけたすべてのイベントは、それが使用されているプログラムから、またはプログラムに対して行われた変更のみを処理しますが、他の2つのプログラム間であっても、すべてのフォーカス変更を見つける必要があります。

また、ウィンドウにピントを合わせる機能も必要です。これは機能しますか、それとも内部的にのみ機能しますか(現在のアプリケーション内のウィンドウであり、他のプログラムではありません)?

乾杯

4

1 に答える 1

3

フォーカス変更検出システムに必要な精度に応じて、説明した API 関数GetForegroundWindowを使用してフォアグラウンド ウィンドウをポーリングするサービスを利用できる場合があります(はい、これはシステム全体であり、プロセス固有ではありません)。

次に、その関数のハンドルを使用して、現在アクティブな/フォーカスされているプロセスを特定できます。次に、そのプロセスのフォーカスされた要素 (子ウィンドウ) を取得します。

HWND hwnd = GetForegroundWindow();
DWORD remoteThreadId = GetWindowThreadProcessId(hwnd, NULL);
DWORD currentThreadId = GetCurrentThreadId();
AttachThreadInput(rThreadId, curThreadId, TRUE);
HWND focusElement = GetFocus();
AttachThreadInput(rThreadId, curThreadId, FALSE);

これを続けて..そしてあなたがする必要があることは何でもしてくださいfocusElement

アップデート

どうやら、@Kenneth K. がコメントに投稿したように、フォアグラウンド (フォーカスされた) ウィンドウが変更されたときにアプリケーションが通知されるようにフックできるグローバルEVENT_SYSTEM_FOREGROUNDイベントがあります。この方法では、これらの変更を検出するために継続的にループする必要はありません。

EVENT_SYSTEM_FOREGROUND = 3;
WINEVENT_OUTOFCONTEXT = 0;

この回答の例に従って、このイベントをフックして通知を受け取る方法を確認できます。次に、フォアグラウンド (フォーカスされた) ウィンドウが変更されるたびに、そのウィンドウのメッセージ ループをフックし、SetWindowsHookEx関数を使用して、そのウィンドウ内でフォーカスが変更されたイベントを確認できます。

もう 1 つのオプションは、MSDN のシステム イベントのリストを調べて、 EVENT_SYSTEM_FOREGROUNDの代わりに、またはそれと一緒に使用して、コントロール レベルのフォーカス イベントを検出できるものがあるかどうかを確認することです。おそらく、EVENT_OBJECT_FOCUSが役に立つかもしれません。

これがまだ不明な場合はお知らせください..

于 2013-03-08T21:17:07.120 に答える