チュートリアル : Windows プロセスの管理
更新 : 2007 年 11 月
このトピックでは、プロセスの作成、プロセスが停止したときの応答、およびプロセスの停止に関する手順について説明します。最初のセクションでは、メモ帳のプロセスを開始および停止する Button コントロールを持つ Windows アプリケーションを作成します。メモ帳の複数のインスタンスを個別に起動した後で、それらをまとめて停止します。2 番目のセクションでは、コンピュータ上で動作中のプロセスを列挙するコンソール アプリケーションを作成します。
Process コンポーネントを使用してシステム プロセスとやり取りする方法の詳細については、「Windows プロセスの監視と管理の概要」を参照してください。
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
アプリケーションを作成するには
[新しいプロジェクト] ダイアログ ボックスで、Visual Basic、Visual C#、または Visual J# の Windows アプリケーションを作成します。
Form1 デザイナが開いた状態で、ツールボックス の [Windows フォーム] タブをクリックし、フォームに 2 つのボタンを追加します。
[プロパティ] ウィンドウで、次のプロパティを変更します。
コントロール
プロパティ
値
Button1
Name
ButtonStart
Text
Start Process
Button2
Name
ButtonStop
Text
Stop Process
ツールボックス の [コンポーネント] タブをクリックし、Process コンポーネントのインスタンスをデザイン画面にドラッグします。
コンポーネントに myProcess という名前を付けます。
Notepad.exe プロセスを開始するには
Process コンポーネントのインスタンスの [プロパティ] ウィンドウで、StartInfo プロパティを展開し、FileName プロパティを notepad.exe に設定します。
[Start Process] をダブルクリックしてコード エディタにアクセスし、ButtonStart_Click() イベントに次のコードを追加します。
myProcess.Start
myProcess.Start();
すべてのファイルを保存し、アプリケーションをビルドして実行します。
[Start Process] を数回クリックします。クリックするたびに、メモ帳の異なるインスタンスが表示されます。
セキュリティに関するメモ : 完全には信頼できないコンテキストでプロセスを実行している場合は、権限不足のために SecurityException 例外がスローされることがあります。詳細については、「コード アクセス セキュリティの基礎」を参照してください。
個別のメモ帳アプリケーションを閉じます。
Form1 アプリケーションを閉じます。
Notepad.exe プロセスの現在のインスタンスをすべて閉じるには
Form1 のコード エディタを開きます。
[デザイン] ビューで、[Stop Process] ボタンをダブルクリックして ButtonStop_Click() プロシージャにアクセスします。
メモ帳の現在のインスタンスを閉じるために、次のコードを追加します。
Private Sub ButtonStop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ButtonStop.Click Dim myProcesses() As Process Dim instance As Process myProcesses = Process.GetProcessesByName("Notepad") For Each instance In myProcesses instance.CloseMainWindow() instance.Close() Next End Sub
private void ButtonStop_Click(object sender, System.EventArgs e) { System.Diagnostics.Process[] myProcesses; myProcesses = System.Diagnostics.Process.GetProcessesByName("Notepad"); foreach (System.Diagnostics.Process instance in myProcesses) { instance.CloseMainWindow(); instance.Close(); } }
すべてのファイルを保存します。次に、アプリケーションをビルドして、実行します。
[Start Process] をクリックして、メモ帳のインスタンスをいくつか起動します。
[Stop Process] をクリックすると、実行されているメモ帳のすべてのインスタンスがすぐに閉じます。
Form1 アプリケーションを閉じます。
次の手順では、プロセスが終了するまでコードを固定します。
メモ帳プロセスの実行が終了するまで待機するようにコンポーネントを構成するには
Form1 のコード エディタを開きます。
各ウィンドウを閉じる前に一時停止するための次のコード行を追加します。
Private Sub ButtonStop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ButtonStop.Click Dim myProcesses() As Process Dim instance As Process myProcesses = Process.GetProcessesByName("Notepad") For Each instance In myProcesses instance.CloseMainWindow() instance.WaitForExit(3000) instance.Close() Next End Sub
private void ButtonStop_Click(object sender, System.EventArgs e) { System.Diagnostics.Process[] myProcesses; myProcesses = System.Diagnostics.Process.GetProcessesByName("Notepad"); foreach (System.Diagnostics.Process instance in myProcesses) { instance.CloseMainWindow(); instance.WaitForExit(3000); instance.Close(); } }
すべてのファイルを保存し、アプリケーションをビルドして実行します。
[Start Processes] をクリックして、メモ帳のインスタンスをいくつか起動します。
前と同じように、[Stop Processes] をクリックしてプロセスを閉じます。
アプリケーションは、各プロセスが停止するまで 3 秒間待ってから、プロセスの次のインスタンスを閉じます。
Form1 アプリケーションを閉じます。
ここでは、ローカル コンピュータ上のプロセスを取得してその一覧を表示する新しいコンソール アプリケーションを作成します。
コンピュータ上のプロセスを列挙するには
新しいコンソール アプリケーション プロジェクトを作成します。
コード エディタを開き、コンピュータ上のプロセスを列挙するよう Main メソッドを変更します。
Sub Main() Dim processes() As Process Dim instance As Process processes = Process.GetProcesses For Each instance In processes Console.WriteLine(instance.ProcessName) Next System.Threading.Thread.Sleep(5000) End Sub
static void Main() { System.Diagnostics.Process[] processes; processes = System.Diagnostics.Process.GetProcesses(); foreach (System.Diagnostics.Process instance in processes) { Console.WriteLine(instance.ProcessName); } System.Threading.Thread.Sleep(5000); }
すべてのファイルを保存します。次に、アプリケーションをビルドして、実行します。
コンソール ウィンドウが開き、コンピュータ上で現在実行されているすべてのプロセスの一覧が表示されます。Sleep の呼び出しにより、コンソールは 5 秒間停止した後で閉じます。
メモ : GetProcesses または GetProcessesByName を呼び出したときに、返されたプロセスの 1 つが次の呼び出しの前に終了すると、これらのプロシージャで例外が発生する場合があります。その場合は、プロセスが存在しないという例外が通知されます。