MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの応用 - 外部ソフトウェアのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの応用 - 外部ソフトウェア
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 外部ソフトウェアにおいて、実行ファイルを指定して起動する方法とファイルを関連付けられたソフトウェアで起動する方法を記載する。<br> また、外部ソフトウェアを起動して、そのソフトウェアが終了するまで待機する方法も記載する。<br> <br><br> == 外部ソフトウェアの起動 == 外部ソフトウェアを起動するには、起動する外部ソフトウェアのパスを指定して、<code>Process</code>クラスの<code>Start</code>メソッドを使用する。<br> <br> 以下の例では、メモ帳を起動している。<br> 外部ソフトウェアが起動する時、<code>Start</code>メソッドはそのプロセスを表す<code>Process</code>クラスを返す。<br> <syntaxhighlight lang="c#"> // メモ帳を起動する var process = System.Diagnostics.Process.Start("notepad.exe"); </syntaxhighlight> <br> <code>Process</code>クラスの<code>Start</code>メソッドの第2引数は、外部ソフトウェアを起動する時に使用するコマンドライン引数を指定する。<br> 以下の例では、コマンドライン引数にテキストファイルのパスを指定してメモ帳を起動している。<br> <syntaxhighlight lang="c#"> // コマンドライン引数を指定してメモ帳を起動する var process = System.Diagnostics.Process.Start("notepad.exe", @"C:\test\test.txt"); </syntaxhighlight> <br> <u>※注意</u><br> <u>外部ソフトウェアが既に起動しており、そのプロセスが再利用された場合は<code>null</code>を返す。</u><br> <u>例えば、Windowsフォトビューアの実体は"dllhost.exe"であるが、これは、フォトビューアの起動の有無に関わらず実行され続けている。</u><br> <u>そのため、<code>Process</code>クラスの<code>Start</code>メソッドでフォトビューアを起動する時、プロセスが再利用されて<code>null</code>を返す。</u><br> <br><br> == ProcessStartInfoクラスを使用してProcess.Startメソッドを呼び出す == <code>Process</code>クラスの<code>Start</code>メソッドは、<code>ProcessStartInfo</code>クラスを指定して呼び出すこともできる。<br> この方法を使用することで、さらに高度な設定を行い、外部ソフトウェアを起動することができる。<br> <br> 以下の例では、メモ帳を起動している。<br> <syntaxhighlight lang="c#"> // ProcessStartInfoクラスを作成する var ProcessInfo = new System.Diagnostics.ProcessStartInfo(); // 起動する実行ファイルのパスを設定する ProcessInfo.FileName = "notepad.exe"; // 外部ソフトウェアを起動する var Process = System.Diagnostics.Process.Start(ProcessInfo); </syntaxhighlight> <br> コマンドライン引数を指定するには、<code>ProcessStartInfo</code>クラスの<code>Arguments</code>プロパティを使用する。<br> 以下の例では、コマンドライン引数にテキストファイルのパスを指定してメモ帳を起動している。<br> <syntaxhighlight lang="c#"> // ProcessStartInfoクラスを作成する var ProcessInfo = new System.Diagnostics.ProcessStartInfo(); // 起動するファイルのパスを指定する ProcessInfo.FileName = "notepad.exe"; // コマンドライン引数を指定する ProcessInfo.Arguments = @"C:\test\test.txt"; // 外部ソフトウェアを起動する System.Diagnostics.Process.Start(ProcessInfo); </syntaxhighlight> <br><br> == インスタンスのProcess.Startメソッドを呼び出す == ProcessクラスのStartメソッドには、引数を持たないメソッドもある。 このメソッドの戻り値はbool型で、プロセスが起動した時にtrue、それ以外の時はfalseを返す。 以下の例では、インスタンスメソッドを使用している。 <syntaxhighlight lang="c#"> // Processオブジェクトを作成する var Process = new System.Diagnostics.Process(); // 起動する外部ソフトウェアのパスを設定する Process.StartInfo.FileName = "notepad.exe"; // 外部ソフトウェアを起動する // 起動した時はtrueを返す bool result = Process.Start(); </syntaxhighlight> <br> 以下の例では、ProcessクラスのStartInfoプロパティで取得できるProcessStartInfoクラスのArgumentsプロパティを使用して、<br> コマンドライン引数を指定している。 <syntaxhighlight lang="c#"> // Processクラスを作成する var Process = new System.Diagnostics.Process(); // 起動する外部ソフトウェアのパスを設定する Process.StartInfo.FileName = "notepad.exe"; // コマンドライン引数を指定する Process.StartInfo.Arguments = @"C:\test\test.txt"; // 外部ソフトウェアを起動する // 起動した時はtrueを返す bool result = Process.Start(); </syntaxhighlight> <br> <u>※注意</u><br> <u>Processクラスの静的なStartメソッドは、内部でProcessクラスを作成して、Startメソッドを呼び出す。</u><br> <u>Startメソッドがtrueのを返す時はProcessクラス、falseを返す時はnullを返す。</u><br> <br><br> == ファイルを関連付けられた外部ソフトウェアで開く == ファイルを関連付けられた外部ソフトウェアで開く場合、上記のセクションの方法で実行できる。<br> (ただし、InteractionクラスのShellメソッドを使用する方法を除く)<br> <br> 以下の例では、テキストファイルを関連付けられた外部ソフトウェアで開いている。<br> <br> ただし、<code>ProcessStartInfo</code>クラスの<code>UseShellExecute</code>プロパティがtrueである必要がある。<br> <code>Process</code>クラスの<code>Start</code>メソッドを呼び出す場合、または、<code>ProcessStartInfo</code>クラスを使用して<code>Process</code>クラスの<code>Start</code>メソッドを呼び出す場合は、<br> <code>UseShellExecute</code>プロパティがfalseになる可能性もあるので注意すること。(<u>初期値はtrueなので、意図的に変更しなければよい</u>)<br> <syntaxhighlight lang="c#"> // テキストファイルを関連付けられた外部ソフトウェアで開く var Process = System.Diagnostics.Process.Start(@"C:\test\test.txt"); </syntaxhighlight> <br> <u>※注意</u><br> <u><code>Process</code>クラスの<code>Start</code>メソッドは、</u><br> <u><code>ProcessStartInfo</code>クラスの<code>UseShellExecute</code>プロパティがtrueの時、<code>ShellExecuteEx</code>メソッドを使用してプロセスを起動する。</u><br> <u><code>ProcessStartInfo</code>クラスの<code>UseShellExecute</code>プロパティがfalseの時、<code>ProcessStartInfo</code>クラスの<code>UserName</code>プロパティを設定する場合、</u><br> <u><code>CreateProcessWithLogonW</code>メソッド使用して、設定していなければ<code>CreateProcess</code>メソッドを使用する。</u><br> <u><code>Interaction</code>クラスの<code>Shell</code>メソッドは、<code>CreateProcess</code>メソッドを使います。</u><br> <br><br> == 同期して待機する == <code>Process</code>クラスの<code>WaitForExit</code>メソッドを使用して、外部ソフトウェアが終了するまで待機することができる。<br> <code>WaitForExit</code>メソッドは同期して待機するため、待機中はフリーズしたようになる。<br> <syntaxhighlight lang="c#"> // メモ帳を起動して終了まで待機する var process = System.Diagnostics.Process.Start("Notepad.exe"); process.WaitForExit(); </syntaxhighlight> <br> 引数に待機する最大時間をミリ秒単位で指定することができる。<br> 指定した時間が経過した場合、プロセスが終了せずとも<code>WaitForExit</code>メソッドが終了し、次の命令に処理が移る。<br> なお、プロセスの終了状態は、<code>Process</code>クラスの<code>HasExited</code>プロパティで確認できる。<br> <syntaxhighlight lang="c#"> // ファイルを開く var process = System.Diagnostics.Process.Start("Notepad.exe"); // 終了するまで10秒待機する process.WaitForExit(10000); // プロセスの終了状態を確認する if (p.HasExited) { MessageBox.Show("終了しました。"); } else { MessageBox.Show("終了していません。"); } </syntaxhighlight> <br><br> == 非同期で待機する == <code>Process</code>クラスの<code>Exited</code>イベントハンドラを使用して、非同期で待機することができる。<br> <code>Exited</code>イベントハンドラは、<code>Process</code>クラスの<code>EnableRaisingEvents</code>プロパティがTrueの時のみ発生する。<br> <br> <code>Process</code>クラスの<code>Exited</code>イベントハンドラは、何もしないと別スレッドで実行される。<br> そのため、マルチスレッドの知識が無いと危険であるが、<code>Process</code>クラスの<code>SynchronizingObject</code>プロパティにフォームを設定することで、<br> そのフォームのスレッドで<code>Exited</code>イベントハンドラが実行されるため、安全に使用できる。<br> <br> 以下の例では、起動したメモ帳が閉じられるまで非同期で待機している。<br> ボタンを押下した場合はメモ帳を起動して、メモ帳が終了するとp_Exitedメソッドを呼び出す。<br> <syntaxhighlight lang="c#"> // Button1のClickイベントハンドラ private void button1_Click(object sender, System.EventArgs e) { // Processオブジェクトを作成する var process = new System.Diagnostics.Process(); // 起動するファイルを指定する process.StartInfo.FileName = "notepad.exe"; // イベントハンドラがフォームを作成したスレッドで実行されるようにする process.SynchronizingObject = this; // イベントハンドラの追加 process.Exited += new EventHandler(p_Exited); // プロセスが終了した時にExitedイベントを発生させる process.EnableRaisingEvents = true; // プロセスを起動する process.Start(); } private void p_Exited(object sender, EventArgs e) { // プロセスが終了したときに実行される MessageBox.Show("終了しました。"); } </syntaxhighlight> <br> 上記の例では、ソースコードの記述のみで全てを設定しているが、<br> Visual Studioのフォームデザイナにある[ツールボックス] - [コンポーネント] - [Process]をフォームに配置するだけで実現できる。<br> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの応用 - 外部ソフトウェア
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse