他の人がすでに指摘しているように
- 一般に、アプリケーションはゼロまたは複数のトップレベル ウィンドウを持つことができます。
- 自分でウィンドウを作成している場合は、HWND をどこかに覚えておくことができます。
ただし、コードが DLL に含まれている可能性があるため、実際にはトップレベル ウィンドウを自分で作成していません。じゃあ何をすればいいの?
次のことをお勧めします。
EnumWindows
すべての最上位ウィンドウを列挙するために使用します。
GetWindowLongPtr
各トップレベル ウィンドウの HINSTANCE を取得するために使用します。これを、 を使用して取得できるアプリケーションの HINSTANCE と比較しますGetModuleHandle(NULL)
。それらが同一である場合、メイン ウィンドウが見つかりました。
編集:ここにいくつかのコードがあります。IsWindowVisible
目に見えない「ヘルパー」ウィンドウがかなりあるように見えるため、使用する必要があることがわかりました。
HWND hwndMain;
BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);
if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
IsWindowVisible(hwnd))
{
hwndMain=hwnd;
return FALSE;
}
else
return TRUE;
}
次に、ウィンドウを見つけたい場所で:
hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);
この後hwndMain
、ウィンドウのハンドルが含まれている必要がありますNULL
。存在しない場合。
MSDN が次のように述べているように、使用EnumWindows
は少し面倒ですがGetWindow
、ループで呼び出すよりも推奨されます。「このタスクを実行するために GetWindow を呼び出すアプリケーションは、無限ループに陥るか、破棄されたウィンドウへのハンドルを参照するリスクがあります。