- 締切済み
インスタンスからハンドルを得るには
普通は1つのインスタンスにトップレベルウインドウが1つある状態だと 思うんだけど、インスタンスからトップレベルウインドウのハンドルを 得るにはどうしたらいいんですか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
回答No.2
>インスタンスから得る場合の最初の1手が分からないんです。 発想の転換をしましょう。 ウィンドウの列挙が可能=ウィンドウを持つアプリのインスタンスハンドルの列挙も可能 ということですよね。 あとは、列挙したウィンドウから取得されるインスタンスハンドルと、自分のインスタンスハンドルを比較するだけでいいと思いますが。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
回答No.1
>普通は1つのインスタンスにトップレベルウインドウが1つある状態だと インスタンスとは、プロセスのことを指しているのでしょうか? トップレベルウィンドウはプロセスで1つとは限りません。 CreateWindowで、親ウィンドウをNULLにすればいくつも作れます。 また、もちろんウィンドウを持たないプロセスも存在します。 で、プロセスとトップレベルウィンドウの関係を調べたいのであれば、EnumWindowでウィンドウを列挙し、GetWindowThreadProcessIdでプロセスIDを取得し、OpenProcessでプロセスハンドルを取得したりするということになります。 自プロセスのウィンドウを調べたいのであれば、GetCurrentProcessIdでチェックも可能です。
お礼
GetWinHndFromInst() と書いてみたけど間違えました。 インスタンスからハンドルが2つ以上得られる場合もあるから、 taka_tetsuさんの回答のように、GetEnumWinHndFromInst() のような感じで、結局は列挙系のコールバックになると思います。 自分の作ったアプリだから、その列挙内では1つしか挙がらず、 その1つが得たいウインドウハンドルであることは分かります。 インスタンスから得る場合の最初の1手が分からないんです。
補足
EnumWindow() は起動中のが全部該当しますよね。 特定のインスタンスを指定してウインドウハンドルを得れば 自分の作った1つのウインドウハンドルが得られると思うんです。 普通のスケルトンで普通のシングルスレッドアプリケーションを 少しだけ変更したものです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hGetWnd; switch(msg){ case WM_RBUTTONDOWN: GetWinHndFronInst?(hGetWnd, (HINSTANCE)GetWindowLong(hGetWnd, GWL_HINSTANCE)); if(hGetWnd == hWnd)MessageBox(hWnd, "インスタンスからウインドウハンドルを得ることができました", "", MB_OK); break; まだインスタンスやプロセスという言葉さえよく分かっていません。