VC++にてタスクマネージャーのように他のアプリ(プロセス)を停止できる方法はありますでしょうか?
最初色々調べていると、どうやら無理そうという感じだったのですが、MSDNの.NETのヘルプで以下のようなものを見つけて、ひょっとすると出来るのかも?と悩んでおります。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbcon/html/vbtskStoppingProcesses.asp
上記は.NETのアプリだけで可能なものなのでしょうか?それともAPIで他のプロセスを取得する等でC++でも可能なのでしょうか?
System.Diagnostics.Process.CloseMainWindowに相当するAPIは
ExitProcessでしょうか?
Microsoft Win32 と Microsoft .NET Framework API との対応
http://www.microsoft.com/japan/msdn/net/general/win32map.asp
すみません、最初の調べ方が悪かったようで、ExitProcessをもとに検索していたら以下のページを見つけました。
http://madia.world.coocan.jp/vc/vc_bbs/200312_03120030.html
結局ウィンドウハンドルを取得できて、WM_CLOSEで終了できればいいし、駄目なら危険だけどTerminateProcess()ということのようですね。上記の.NETのヘルプもたぶん同じ内容を指しているようです。
とりあえずEnumWindows()を使って上記の内容で組んでみます。
すみません、ずいぶん亀レスなのですが
上記の解決のために
EnumProcesses()で全てのプロセスを取得し、
EnumProcessModules()でプロセス内のモジュールを取得し、
GetModuleFileNameEx()でモジュールのexeファイル名を取得して、
停止したいアプリの exeファイル名と比較して、停止したいアプリのプロセスを特定する…という所まではできました。
このあと出来ればTerminateProcess()ではなく、そのプロセスのウィンドウハンドルを取得して
PostMessage(hWnd,WM_CLOSE,0,0);
をしたいのですが、プロセスやモジュールからウィンドウハンドルを取得する方法が分かりません。
どなたかご教授願えないでしょうか?
ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。
>ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。
EnumProcessesで取得したプロセスIDと
EnumWindows & GetWindowThreadProcessId で取得したIDを比較して
ウィンドウハンドルを取得する。
EnumProcesses、OpenProcess、EnumProcessModules、GetModuleFileNameEx
でパスを取得しているならば、
CreateToolhelp32Snapshot , Process32First , Process32Next
を使ったほうが便利かも。(速度的なことはわかりませんけど)
参考)http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200608/06080014.txt
よく考えたら、
>停止したいアプリの exeファイル名と比較して、停止したいアプリのプロセスを特定する…という所まではできました。
>ちなみにそのアプリはシステムトレイに常駐しているため、直接FindWindow()は出来ませんでした。
から、EXE名からウィンドウハンドルを取得したいということなんでしょうか?
そうなると、EnumWindowsでウィンドウハンドルを列挙し、そのウィンドウハンドルから
EXE名を取得するようなつくりにしたほうがムダがなさそうですけど。
参考)ウィンドウハンドルから .EXE 名を取得するには?http://techtips.belution.com/ja/vc/0022/
>EXE名からウィンドウハンドルを取得したいということなんでしょうか?
はい、そうなります。質問の題名が悪かったですm(__)m
正しくは「exeファイル名からそのアプリをPostMessage()で停止させる方法は?」ですね。
>そのウィンドウハンドルからEXE名を取得するようなつくり
さっそくその方法でやってみまして上手くいきました!
どうも有難うございましたm(__)m
ツイート | ![]() |