プロセスを終了するには?

解決


匿名  2005-03-16 22:33:47  No: 13788

自分で指定したプロセス(notepad.exe等)を、タスクマネージャーのようにボタンクリックで終了させる方法を教えて下さい。


Fusa  2005-03-17 04:28:52  No: 13789

プロセス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: プログラムを強制終了する方法


匿名  2005-03-17 05:03:54  No: 13790

ありがとうございます


匿名  2005-03-17 19:41:18  No: 13791

すいません、解決じゃありませんでした。
プロセスID(例えばnotepad.exeの)の取得ってどうすればいいのでしょうか。


たかみちえ  URL  2005-03-17 19:45:32  No: 13792

同サイトの、Delphi Tips で、"プロセス"を検索してみてください。
http://www2.big.or.jp/~osamu/Delphi/Tips/
Win9xとNT系で取得方法が違うようですので、お気をつけください。


匿名  2005-03-17 20:01:01  No: 13793

ありがとうございます。

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で)  それから、終了させるプロセスを指定してボタンを押すと、プロセスが落ちるというプログラムを作っているのです。


通りすがり  2005-03-17 22:02:54  No: 13794

TerminateProcessを正常に動作しているプロセスに対して使用するのはまずいのですが、
匿名さんはそのことを理解されていますよね?


匿名  2005-03-17 22:13:00  No: 13795

TerminateProcess  より  PostMessage  の方が良いとは書いてありましたが。。


通りすがり  2005-03-17 22:20:01  No: 13796

> TerminateProcess  より  PostMessage  の方が良いとは書いてありましたが。。
「の方が良い」とは書いてなかったはずですよ。^_^;
TerminateProcessは正常に動作しているプロセスに対して使うべきではないと思います。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_terminateprocess.htm
ここの解説を読んでみてください。


匿名  2005-03-17 22:21:41  No: 13797

いえ、どこかのサイトで見た気がします。

強制力が強いようですね。。ExitProcessという関数の方がいいのでしょうか。


通りすがり  2005-03-17 22:52:29  No: 13798

> いえ、どこかのサイトで見た気がします。
ちょっと誤解させてしまったような。
私は「TerminateProcess  より  PostMessage  の方が良いとは書いてありましたが。。」
が意味的におかしいと思ったんです。
「の方が良い」ということではなくて、2つは使用する目的が違うと思います。
TerminateProcessは強制終了で、アプリケーションの内部仕様によってはリソースリークを
発生させます。
アプリケーションで処理中のデータも保存されません。
PostMessageはユーザーが普通にそのアプリケーションを終了させるのと同じことを
プログラムから行うものです。
「終了してください」というメッセージを送るわけです。

> 強制力が強いようですね。。
そうとも言えますが、何か匿名さんは誤解されているような気がするのですが。
繰り返しになりますが、正常に動作しているプロセスに対してTerminateProcessを
使うのは非常にまずいというのはわかりますよね?
非常にまずいというより、正常に動作しているプロセスに対しては使っちゃダメなんですが。


匿名  2005-03-18 01:10:37  No: 13799

では、どうすればいいのでしょうか


通りすがり  2005-03-18 01:34:18  No: 13800

匿名さんはどういう処理をしたいのですか?
匿名さんの最初の質問が「タスクマネージャのように」ということだったので、Fusaさんは
強制終了に関する情報を書かれたのですが、匿名さんは本当に強制終了させるのが目的なのですか?


Mr.XRAY  URL  2005-03-18 02:10:35  No: 13801

もしかして,プロセスというより,アプリケーションを終了したい
というこではないのでしょうか.
以下の様に...

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;


Mr.XRAY  URL  2005-03-18 02:14:07  No: 13802

あっ,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;


Mr.XRAY  URL  2005-03-18 02:34:25  No: 13803

もし,正常に動作しているアプリではなく,何かの不具合であるアプリ
のプロセスが残ってしまっ場合,すなわち,タスクマネージャの
[アプリケーション]タブには表示されないが,[プロセス]のリストには
あるという場合です.

面倒でしょうけど,DLしてコードをみて下さい.
お断りしておきますが,決していいコードとは言えません.

http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/T_WordKill.htm
http://homepage2.nifty.com/Mr_XRAY/Delphi/plExcel/T_ExcelKill.htm

>匿名さんはどういう処理をしたいのですか?

概要を述べた文面だけてはわかりませんね.リスト表示はできているとい
うのですから,なにか情報があるといいですね.
ても,リストされたプロセスを落とす
(この表現はちょっとね...,確かにそうなのですが...)
というのは,これまた恐ろしいプログラムですね.


匿名  2005-03-18 04:14:54  No: 13804

えっと、タスクマネージャーのプロセスからプログラムを終了させたいんです。

リストボックスに列挙されたプロセスから、選択したプロセスをボタンクリックで強制終了させたいのです。(タスクマネージャーと同じ


Mr.XRAY  URL  2005-03-18 04:39:38  No: 13805

>リストボックスに列挙されたプロセスから、選択したプロセスをボタンクリックで強制終了させたいのです。(タスクマネージャーと同じ

話が堂々巡りになっていますよ〜.


Mr.XRAY  URL  2005-03-18 04:47:07  No: 13806

>http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/T_WordKill.htm

これとは違うということですか.
これはワードのプロセスですが,プロセスのリストを表示していますから,
動作は,リストの選択したものを強制終了すればいいのでは...

リストを選択した時に,リストの項目を取得する方法がわからないと
いうことですか?

何がわからないのか,私には分かりません.
それとも希望の動作を想像して,誰か作ってくれませんか,ということで
すか?


匿名  2005-03-18 05:50:36  No: 13807

>Mr.Xray様

はい、まさにそれです。ただ僕がやりたいのは、リストボックスから終了するプロセスを選択出来ると言う事なんです。。


.  2005-03-18 05:57:57  No: 13808

http://sourceforge.net/projects/progkill/
これはどうですか?


Fusa  2005-03-18 06:17:53  No: 13809

匿名さんは
プロセス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の話でした。


Mr.XRAY  URL  2005-03-18 08:46:04  No: 13810

Fusaさん,詳しい解説サンクスです.ところで,

>はい、まさにそれです。ただ僕がやりたいのは、リストボックスから終了するプロセスを選択出来ると言う事なんです。。

まったく話が進んでいません.人の発言をよく読みましょう.
また,以下のメール関係のリンクをお読みになるのも参考となるでしょう.
何か手助けをしたいのですが,私の手には負えません.
環境の記載もないし... 「匿名」も捨てハンでしょうね?

http://homepage2.nifty.com/Mr_XRAY/Links.htm#Mail


メラトニン  2005-03-18 11:55:45  No: 13811

応えるほうにも
http://homepage2.nifty.com/Mr_XRAY/Links.htm#Mail

質問する人のスキルを見れば「プロセスの終了」の意味が正しくできていないのは分かるはず、むやみに質問者を傷つけてませんか?
読めとリンクを張ったリンクが理解できない、けど本人は理解したつもりなんてのは日常茶飯事。


Mr.XRAY  URL  2005-03-18 21:21:59  No: 13812

>応えるほうにも

そうですね.反省しています.墓穴をほってしまいました.
もう少し匿名さんの状況を考えてみることにしましょう.


匿名  2005-03-19 02:23:58  No: 13813

Xray様や、Fusa様、その他の方々の説明で大体理解できました。
あとは、プロセスIDの取得だけです。ここからは、皆さんがリンクしてくださったページを見て一人で頑張ろうと思います。
それで、ここのスレは完全解決にしようと思います。今まで本当にありがとうございました。

#まだ精進の足りない僕に付き合ってくれた皆さん、本当にありがとうございました、そして忙しい所すいませんでした。


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

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






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