1

WTL C ++アプリケーションがアクティブ化されたとき、またはキーボードフォーカスを取得したとき、以前にアクティブ化された/フォーカスがあったアプリケーションのウィンドウハンドルを判別する必要があります。WM_SETFOCUSただし、とWM_ACTIVATEメッセージの両方のウィンドウハンドル(LPARAM)は両方NULL(XP、32ビット)です。

アプリケーションがアクティブ化されたときにフォーカスを失ったアプリケーションを特定するにはどうすればよいですか?これを行う簡単な方法はありますか、それとも特別なCBTフックを巻く必要がありますか?

4

1 に答える 1

4

送信されているメッセージとそのパラメーターを正確に確認する簡単な方法は、Spy++ を起動してログ メッセージに設定し、Alt+Tab で別のウィンドウに移動することです。

あなたが発見したことと一致して、以前にアクティブだったウィンドウ (またはアクティブになっているウィンドウ) が同じスレッドにない場合はlParam、両方WM_SETFOCUSWM_ACTIVATEなります。NULL

WM_ACTIVATEAPPDavid が提案したように、あなたは でもっと運がいいかもしれません。スレッド識別子を取得したら、GetGUIThreadInfo関数を呼び出して、そのスレッドのアクティブ ウィンドウを特定できます。この関数は、アクティブなウィンドウが呼び出しプロセスによって所有されていない場合でも機能します。

あなたのアプリが、ユーザーが長時間開いて実行し続けることが期待されていない小さなユーティリティ以外のものである場合、潜在的なパフォーマンスへの影響を考えると、可能な限り CBT フックの使用を避けます。残念ながら、プロセスの境界を越えたこのような対話は困難です。

Windows の将来のバージョンで壊れる可能性のあるものを使用することを恐れていない場合は、RegisterShellHookWindow関数を調査できます。自分で使用したことがないので、あまり詳しくは言えませんが、フックをインストールすることによってのみ受信するシェル メッセージを取得する簡単な方法です。
Windows 2000 までさかのぼりますが、XP SP1 まで SDK に含まれていませんでした。私が知る限り、Windows Vista と 7 にはまだ存在します。

于 2011-03-03T09:23:51.683 に答える