送信されているメッセージとそのパラメーターを正確に確認する簡単な方法は、Spy++ を起動してログ メッセージに設定し、Alt+Tab で別のウィンドウに移動することです。
あなたが発見したことと一致して、以前にアクティブだったウィンドウ (またはアクティブになっているウィンドウ) が同じスレッドにない場合はlParam
、両方WM_SETFOCUS
とWM_ACTIVATE
なります。NULL
WM_ACTIVATEAPP
David が提案したように、あなたは でもっと運がいいかもしれません。スレッド識別子を取得したら、GetGUIThreadInfo
関数を呼び出して、そのスレッドのアクティブ ウィンドウを特定できます。この関数は、アクティブなウィンドウが呼び出しプロセスによって所有されていない場合でも機能します。
あなたのアプリが、ユーザーが長時間開いて実行し続けることが期待されていない小さなユーティリティ以外のものである場合、潜在的なパフォーマンスへの影響を考えると、可能な限り CBT フックの使用を避けます。残念ながら、プロセスの境界を越えたこのような対話は困難です。
Windows の将来のバージョンで壊れる可能性のあるものを使用することを恐れていない場合は、RegisterShellHookWindow
関数を調査できます。自分で使用したことがないので、あまり詳しくは言えませんが、フックをインストールすることによってのみ受信するシェル メッセージを取得する簡単な方法です。
Windows 2000 までさかのぼりますが、XP SP1 まで SDK に含まれていませんでした。私が知る限り、Windows Vista と 7 にはまだ存在します。