自分で指定したプロセス(notepad.exe等)を、タスクマネージャーのようにボタンクリックで終了させる方法を教えて下さい。
プロセスIDがわかれば、次のようにするとよいようですよ。
var
ProcessID: Cardinal;
hProcess: THandle;
begin
//ProcessIDを得ておく
//ProcessID := xx;
hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
TerminateProcess(hProcess , 0 );
CloseHandle(hProcess);
end;
以下を参考にしました。W2KとWinXPで動作確認しています。
http://www2.big.or.jp/~osamu/Delphi/browse.cgi?index=47838
[Delphi:47838] Re: プログラムを強制終了する方法
ありがとうございます
すいません、解決じゃありませんでした。
プロセスID(例えばnotepad.exeの)の取得ってどうすればいいのでしょうか。
同サイトの、Delphi Tips で、"プロセス"を検索してみてください。
http://www2.big.or.jp/~osamu/Delphi/Tips/
Win9xとNT系で取得方法が違うようですので、お気をつけください。
ありがとうございます。
procedure TForm1.Button1Click(Sender: TObject);
var
PID: DWORD;
Ph: THandle;
ProcessID: Cardinal;
hProcess: THandle;
begin
ProcessID := GetWindowThreadProcessId(Handle, @PID);
hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
TerminateProcess(hProcess , 0 );
CloseHandle(hProcess);
end;
で、正しく終了出来ませんでした。 あと、どこで「notepad.exe」を指定すればいいのでしょうか。。
実はリストボックスに今稼動してるプロセス名をすべて列挙する事は出来ました(ここのTipsで) それから、終了させるプロセスを指定してボタンを押すと、プロセスが落ちるというプログラムを作っているのです。
TerminateProcessを正常に動作しているプロセスに対して使用するのはまずいのですが、
匿名さんはそのことを理解されていますよね?
TerminateProcess より PostMessage の方が良いとは書いてありましたが。。
> TerminateProcess より PostMessage の方が良いとは書いてありましたが。。
「の方が良い」とは書いてなかったはずですよ。^_^;
TerminateProcessは正常に動作しているプロセスに対して使うべきではないと思います。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_terminateprocess.htm
ここの解説を読んでみてください。
いえ、どこかのサイトで見た気がします。
強制力が強いようですね。。ExitProcessという関数の方がいいのでしょうか。
> いえ、どこかのサイトで見た気がします。
ちょっと誤解させてしまったような。
私は「TerminateProcess より PostMessage の方が良いとは書いてありましたが。。」
が意味的におかしいと思ったんです。
「の方が良い」ということではなくて、2つは使用する目的が違うと思います。
TerminateProcessは強制終了で、アプリケーションの内部仕様によってはリソースリークを
発生させます。
アプリケーションで処理中のデータも保存されません。
PostMessageはユーザーが普通にそのアプリケーションを終了させるのと同じことを
プログラムから行うものです。
「終了してください」というメッセージを送るわけです。
> 強制力が強いようですね。。
そうとも言えますが、何か匿名さんは誤解されているような気がするのですが。
繰り返しになりますが、正常に動作しているプロセスに対してTerminateProcessを
使うのは非常にまずいというのはわかりますよね?
非常にまずいというより、正常に動作しているプロセスに対しては使っちゃダメなんですが。
では、どうすればいいのでしょうか
匿名さんはどういう処理をしたいのですか?
匿名さんの最初の質問が「タスクマネージャのように」ということだったので、Fusaさんは
強制終了に関する情報を書かれたのですが、匿名さんは本当に強制終了させるのが目的なのですか?
もしかして,プロセスというより,アプリケーションを終了したい
というこではないのでしょうか.
以下の様に...
procedure TForm1.Button1Click(Sender: TObject);
var
TargetWnd : HWND;
begin
TargetWnd:=FindWindow('NotePad',nil);
if TargetWnd<>0 then begin
SendMessage(TargetWnd,WM_CLOSE,0,0);
end;
end;
あっ,PostMessageでしたね.
procedure TForm1.Button1Click(Sender: TObject);
var
TargetWnd : HWND;
begin
TargetWnd:=FindWindow('NotePad',nil);
if TargetWnd<>0 then begin
PostMessage(TargetWnd,WM_CLOSE,0,0);
end;
end;
もし,正常に動作しているアプリではなく,何かの不具合であるアプリ
のプロセスが残ってしまっ場合,すなわち,タスクマネージャの
[アプリケーション]タブには表示されないが,[プロセス]のリストには
あるという場合です.
面倒でしょうけど,DLしてコードをみて下さい.
お断りしておきますが,決していいコードとは言えません.
http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/T_WordKill.htm
http://homepage2.nifty.com/Mr_XRAY/Delphi/plExcel/T_ExcelKill.htm
>匿名さんはどういう処理をしたいのですか?
概要を述べた文面だけてはわかりませんね.リスト表示はできているとい
うのですから,なにか情報があるといいですね.
ても,リストされたプロセスを落とす
(この表現はちょっとね...,確かにそうなのですが...)
というのは,これまた恐ろしいプログラムですね.
えっと、タスクマネージャーのプロセスからプログラムを終了させたいんです。
リストボックスに列挙されたプロセスから、選択したプロセスをボタンクリックで強制終了させたいのです。(タスクマネージャーと同じ
>リストボックスに列挙されたプロセスから、選択したプロセスをボタンクリックで強制終了させたいのです。(タスクマネージャーと同じ
話が堂々巡りになっていますよ〜.
>http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/T_WordKill.htm
これとは違うということですか.
これはワードのプロセスですが,プロセスのリストを表示していますから,
動作は,リストの選択したものを強制終了すればいいのでは...
リストを選択した時に,リストの項目を取得する方法がわからないと
いうことですか?
何がわからないのか,私には分かりません.
それとも希望の動作を想像して,誰か作ってくれませんか,ということで
すか?
>Mr.Xray様
はい、まさにそれです。ただ僕がやりたいのは、リストボックスから終了するプロセスを選択出来ると言う事なんです。。
http://sourceforge.net/projects/progkill/
これはどうですか?
匿名さんは
プロセスIDの取得方法がわからなくなっているのではないでしょうか
Mr.XRAYさんのページ[ワード操作フォーム]
http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/index.htm
から、左上のplWord.lzhの中の[10_WordKill]という名前のフォルダを開き
Unit1.pasのコードを見てください。
現在起動しているプロセス一覧を取得して、
そのなかに"WINWORD.EXE"が含まれている場合
メッセージを表示後に
プロセスの強制終了を行うというコードになっています。
XRAYさんに感謝しつつ(^o^)
勉強してみてください。
※GetWindowThreadProcessIdで取得できるのは
いわゆるプロセスIDとは違うようですね。
タスクマネージャでもPIDを表示させることができるので
それと見比べながら試してみてください。
いずれも、環境はWin2K,XPの話でした。
Fusaさん,詳しい解説サンクスです.ところで,
>はい、まさにそれです。ただ僕がやりたいのは、リストボックスから終了するプロセスを選択出来ると言う事なんです。。
まったく話が進んでいません.人の発言をよく読みましょう.
また,以下のメール関係のリンクをお読みになるのも参考となるでしょう.
何か手助けをしたいのですが,私の手には負えません.
環境の記載もないし... 「匿名」も捨てハンでしょうね?
http://homepage2.nifty.com/Mr_XRAY/Links.htm#Mail
応えるほうにも
http://homepage2.nifty.com/Mr_XRAY/Links.htm#Mail
質問する人のスキルを見れば「プロセスの終了」の意味が正しくできていないのは分かるはず、むやみに質問者を傷つけてませんか?
読めとリンクを張ったリンクが理解できない、けど本人は理解したつもりなんてのは日常茶飯事。
>応えるほうにも
そうですね.反省しています.墓穴をほってしまいました.
もう少し匿名さんの状況を考えてみることにしましょう.
Xray様や、Fusa様、その他の方々の説明で大体理解できました。
あとは、プロセスIDの取得だけです。ここからは、皆さんがリンクしてくださったページを見て一人で頑張ろうと思います。
それで、ここのスレは完全解決にしようと思います。今まで本当にありがとうございました。
#まだ精進の足りない僕に付き合ってくれた皆さん、本当にありがとうございました、そして忙しい所すいませんでした。
ツイート | ![]() |