他のアプリを停止するには

解決


チェン  2006-06-29 15:21:22  No: 62374  IP: 192.*.*.*

VC++にてタスクマネージャーのように他のアプリ(プロセス)を停止できる方法はありますでしょうか?

最初色々調べていると、どうやら無理そうという感じだったのですが、MSDNの.NETのヘルプで以下のようなものを見つけて、ひょっとすると出来るのかも?と悩んでおります。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbcon/html/vbtskStoppingProcesses.asp

上記は.NETのアプリだけで可能なものなのでしょうか?それともAPIで他のプロセスを取得する等でC++でも可能なのでしょうか?

編集 削除
Blue  2006-06-29 17:12:32  No: 62375  IP: 192.*.*.*

System.Diagnostics.Process.CloseMainWindowに相当するAPIは
ExitProcessでしょうか?

Microsoft Win32 と Microsoft .NET Framework API との対応
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

編集 削除
チェン  2006-06-29 19:13:24  No: 62376  IP: 192.*.*.*

すみません、最初の調べ方が悪かったようで、ExitProcessをもとに検索していたら以下のページを見つけました。
http://madia.world.coocan.jp/vc/vc_bbs/200312_03120030.html

結局ウィンドウハンドルを取得できて、WM_CLOSEで終了できればいいし、駄目なら危険だけどTerminateProcess()ということのようですね。上記の.NETのヘルプもたぶん同じ内容を指しているようです。

とりあえずEnumWindows()を使って上記の内容で組んでみます。

編集 削除
チェン  2006-09-01 14:00:57  No: 62377  IP: 192.*.*.*

すみません、ずいぶん亀レスなのですが

上記の解決のために
EnumProcesses()で全てのプロセスを取得し、
EnumProcessModules()でプロセス内のモジュールを取得し、
GetModuleFileNameEx()でモジュールのexeファイル名を取得して、
停止したいアプリの      exeファイル名と比較して、停止したいアプリのプロセスを特定する…という所まではできました。

このあと出来ればTerminateProcess()ではなく、そのプロセスのウィンドウハンドルを取得して
PostMessage(hWnd,WM_CLOSE,0,0);
をしたいのですが、プロセスやモジュールからウィンドウハンドルを取得する方法が分かりません。

どなたかご教授願えないでしょうか?

ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。

編集 削除
Blue  2006-09-01 14:13:48  No: 62378  IP: 192.*.*.*

>ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。
EnumProcessesで取得したプロセスIDと
EnumWindows & GetWindowThreadProcessId で取得したIDを比較して
ウィンドウハンドルを取得する。

編集 削除
Blue  2006-09-01 14:52:12  No: 62379  IP: 192.*.*.*

EnumProcesses、OpenProcess、EnumProcessModules、GetModuleFileNameEx
でパスを取得しているならば、
CreateToolhelp32Snapshot , Process32First , Process32Next
を使ったほうが便利かも。(速度的なことはわかりませんけど)
参考)http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200608/06080014.txt

編集 削除
Blue  2006-09-01 15:43:51  No: 62380  IP: 192.*.*.*

よく考えたら、
>停止したいアプリの exeファイル名と比較して、停止したいアプリのプロセスを特定する…という所まではできました。
>ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。
から、EXE名からウィンドウハンドルを取得したいということなんでしょうか?
そうなると、EnumWindowsでウィンドウハンドルを列挙し、そのウィンドウハンドルから
EXE名を取得するようなつくりにしたほうがムダがなさそうですけど。

参考)ウィンドウハンドルから .EXE 名を取得するには?http://techtips.belution.com/ja/vc/0022/

編集 削除
チェン  2006-09-01 18:50:50  No: 62381  IP: 192.*.*.*

>EXE名からウィンドウハンドルを取得したいということなんでしょうか?
はい、そうなります。質問の題名が悪かったですm(__)m
正しくは「exeファイル名からそのアプリをPostMessage()で停止させる方法は?」ですね。

>そのウィンドウハンドルからEXE名を取得するようなつくり
さっそくその方法でやってみまして上手くいきました!
どうも有難うございましたm(__)m

編集 削除