フォーカス変更検出システムに必要な精度に応じて、説明した 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が役に立つかもしれません。
これがまだ不明な場合はお知らせください..