ウインドウを持たないExeからEmumWindow

解決


向日葵  2003-05-20 18:15:23  No: 51420

こんにちは、向日葵です。

ウインドウを持たないExeからEmumWindowを使い、
自Exe以外のウインドウを閉じてそのまま終了というものを
作りたいと思っています。

そこでイメージを作ってみたのですが、ウインドウを作らないので
WinMainでCreateWindowでExeのウインドウハンドルを作りこれを
EnumWindowProcのコールバック関数に引数を渡すことができません。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                 PSTR lpCmdLine, int nCmdShow) {
        
  EnumWindowProc(?,?)

}

BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)  {

//WM_CLOSEのPostMessageで順次ウインドウを閉じる処理

}


YuO  2003-05-20 19:15:14  No: 51421

> EnumWindowProcのコールバック関数に引数を渡すことができません。

コールバック関数を直接呼び出してどうするのでしょう……。
EnumWindowsを使うのでしょう?


向日葵  2003-05-20 20:19:05  No: 51422

YuOさん、レスありがとうございます。

失礼しましたEnumWindowsの間違いでした。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                 PSTR lpCmdLine, int nCmdShow) {

EnumWindows(EnumWindowsProc, NULL);

}

これで良いのでしょうか?

また、EnumWindowsProcの中で自分のExeか
どうかを判断するにはどう判断するのがスマートでしょうか?

重ね重ね宜しくお願いします。


YuO  2003-05-20 23:44:07  No: 51423

> これで良いのでしょうか?

いいと思いますが。

> また、EnumWindowsProcの中で自分のExeか
> どうかを判断するにはどう判断するのがスマートでしょうか?

ウィンドウを持っていないのではなかったのですか?

でもって,実行ファイル単位で比較することは非常に面倒くさいです。
一番手っ取り早いのは,UUIDか何かを使ってRegisterWindowMessageして,
それに対する応答を見ることだと思います。

普通はあり得ない反応を返すようにしておけば,ほとんど間違いなく判別できます。

まじめに判定するなら,ウィンドウハンドルからProcess IDを取得して,
それを元にファイル名を取得して,自分のファイル名と比較することになります。

・Windows 95系統
ToolHelp API群を使う
・Windows NT系統
GetModuleFileNameEx APIを使う


向日葵  2003-05-21 02:11:32  No: 51424

YoOさん、レスどうもです。

>ウィンドウを持っていないのではなかったのですか?

ハイ、持っていません。

あっそういう事ですか!?

ウインドウを持たないからEnumWindowで余計な判定
は必要無いというオチでしょうか(^^ゞ

>まじめに判定するなら,ウィンドウハンドルからProcess IDを取得して,
>それを元にファイル名を取得して,自分のファイル名と比較することになり>ます。

これはExeがウインドウを持つ場合ですね、ありがとうございます。
ファイル名の取得は要らないのではないでしょうか?

APIはGetWindowThreadProcessIdこれを使い、
ウインドウハンドルからProcess IDを取得し
これらの比較では問題あるでしょうか?


向日葵  2003-05-21 02:11:40  No: 51425

YuOさん、レスどうもです。

>ウィンドウを持っていないのではなかったのですか?

ハイ、持っていません。

あっそういう事ですか!?

ウインドウを持たないからEnumWindowで余計な判定
は必要無いというオチでしょうか(^^ゞ

>まじめに判定するなら,ウィンドウハンドルからProcess IDを取得して,
>それを元にファイル名を取得して,自分のファイル名と比較することになり>ます。

これはExeがウインドウを持つ場合ですね、ありがとうございます。
ファイル名の取得は要らないのではないでしょうか?

APIはGetWindowThreadProcessIdこれを使い、
ウインドウハンドルからProcess IDを取得し
これらの比較では問題あるでしょうか?


YuO  2003-05-21 05:11:06  No: 51426

> ファイル名の取得は要らないのではないでしょうか?

え〜っと,

> また、EnumWindowsProcの中で自分のExeか
> どうかを判断するにはどう判断するのがスマートでしょうか?

とのことだったので,同じEXEファイルが作成したウィンドウ全てを判定から外した方がよいかと思いまして。

ファイルではなく,プロセス単位であれば,

> APIはGetWindowThreadProcessIdこれを使い、
> ウインドウハンドルからProcess IDを取得し
> これらの比較では問題あるでしょうか?

でよいと思います。


向日葵  2003-05-21 20:46:34  No: 51427

YuOさん、どうもです。

>同じEXEファイルが作成したウィンドウ全てを判定から外した方がよいかと
>思いまして。

このような場合に、ファイルで判断するのですか。

このようなことも今後考慮してゆきたいので、
これも勉強しておきたいと思います。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加