プロセスIDとプロセスハンドルとウィンドウハンドルの件
- ウィンドウハンドルからプロセスID
- GetWindowThreadProcessId() で可能。 プロセスIDはユニークなので、逆検索も可能。
- プロセスIDからウィンドウハンドル
- EnumWindows()で全ウィンドウを列挙し、上述のGetWindowThreadProcessId()で逆検索。
- プロセスIDからプロセスハンドル
- OpenProcess()で可能。ただし、逆は一意ではないので逆検索は出来ない。
- プロセスハンドルからプロセスID
- にっちもさっちも。
- CreateProcess()
- プロセスIDが取得でき、無問題。
- ShellWindowEx()
- プロセスハンドルしか取得できない。よってプロセスIDは取得できない。ただし、起動したプロセスは親子関係になるので、それを利用する。
- 親子関係からウィンドウハンドル
- CreateToolhelp32Snapshot()により、起動中の全プロセスの情報を取得できる。th32ParentProcessIDとGetCurrentProcessId()を比較することにより、自分が起動したプロセスのプロセスIDのリストを取得できる。それをさらにEnumWindows()回して逆探知することで、ようやくウィンドウハンドルを取得可能。
OSは知ってるはずなのになぜこんなに苦労しなければならないのか。
- ShellExecuteEx ≒ AssocQueryString()+CreateProcess() - kuboon (07/04/20 16:59)