最近開いたウィンドウを追跡する 1 つの方法は、SetWinEventHook を使用して EVENT_OBJECT_CREATE および EVENT_OBJECT_SHOW イベントをリッスンすることです。コールバックで、次をフィルタリングします。
- idObject==OBJID_WINDOW が null 以外の HWND を持つイベントのみで、ウィンドウ作成イベントのみを取得します (リストボックス内のアイテムなどの他の作成イベントに対して)。
- トップレベルのみのウィンドウの場合、GetAncestor(hwnd, GA_PARENT)が GetDesktopWindow() であることを確認してフィルタリングします。
- そして、ウィンドウが実際に現在表示されていることを確認します (WS_VISIBLE スタイルが GetWindowLong(GWL_STYLE) で設定されています)。
また、特定のアプリからの HWND のみを気にする場合は、GetWindowThreadProcessId() および SetWinEventHook に渡すスレッド/プロセスを介してフィルター処理します。
これらのイベントの両方をチェックする理由は、非表示に作成されてから表示されるウィンドウもあれば、完全に表示されるように作成されるウィンドウもあれば、一度作成された後、存続期間中に何度も表示/非表示にされるウィンドウもあるためです。
次に、この「最後に作成された既知の hwnd」をグローバルにキャッシュし、必要に応じて確認し、GetWindowRect() を使用してその場所を取得し、SetCursorPos() を使用してマウスをその場所に移動します。
--
最新のポップアップが、フォーカスを取得するアクティブなウィンドウである場合 (ダイアログの場合はそうですが、通常は「ポップアンダー」ウィンドウの場合はそうではありません)、GetGUIThreadInfo(NULL, ...)を使用して、現在アクティブな HWND を特定できます。これは、探しているものである可能性があり、渡した構造体の GUITHREADINFO.hwndActive メンバーに返されます。