2017-02-05 12 views
-2

出力をウィンドウに表示するcmdプロセスを作成しました。コマンドプロンプトでControl-cを押すなどのコマンドを終了できるようにしたいと考えています。cmd.exeに発行されたコマンドを終了するには

new ProcessStartInfo("cmd.exe"); 

私が考えることができる唯一の選択肢は、プロセスを終了することです。これはcontrol-cを押しているのでしょうか?この問題は、一部のユーザー設定が失われることがあります。 2つは、プロンプトと現在のディレクトリと考えることができます。それ以外のものはありますか?私はこれらを覚えて、新しいプロセスを作り、それらをリセットすることができます。または、中断をシミュレートする別の方法がありますか?

enter image description here

あなたはスタートメソッドを呼び出すことにより、プロセスを開始することができます。また、キルメソッドを呼び出して、プロセスを終了することもできます。すべての井戸と良い。 cmd.exeを実行して入力と出力をリダイレクトすることで、プロセスを開始できます。それでは、長い時間がかかるコマンドを実行すると仮定します。私たちがDOSウィンドウ(コマンドプロンプト)でできるようにコマンドをキャンセルするのは、ユーザーがプロセス内で履歴を失ったアプリケーションを閉じて再オープンする代わりに、キャンセルするのが良いでしょう。

必要に応じてさらに詳しい情報を提供できます。

+0

cmd.exeでプロセスを開始した後でCTRL + Cを押すと、そのプロセスが終了します。 "taskkill/im "を呼び出すことによっても同じことができます。 – Stavm

+0

実際にはctrl-cは何もしません。 cmd.exeはプロセスです。そのプロセスはコマンドを実行します。私はプロセスを終了せずにコマンドを終了したい。これは可能ですか? –

+0

作成する新しいプロセスは、出力を表示するだけです。一方、「いくつかのユーザー設定」を保存する必要があります。それははっきりしていません。 – KernelMode

答えて

1

cmd.exeのが原因ドキュメントのこの制限により、がGenerateConsoleCtrlEventあり、そして、あなたのProcess.Start呼び出しが新しいコンソールを作成したとき、それは利用できません使用するメカニズム:中

プロセスのみコールプロセスと同じコンソールを共有するグループは、シグナルを受信します。つまり、グループ内のプロセスが新しいコンソールを作成した場合、そのプロセスはシグナルを受信せず、その子孫も処理しません。

あなたが持っているオプションは、直接cmd.exeを起動しないことですが、今度はその共有コンソールでcmd.exeを開始し、また知るために、あなたのプログラムを開いているとの通信リンクを維持するための両方の責任があるコンソールプログラムを開始コンソールコントロールイベントを生成するタイミング。

実際には、Ctrl + Cを検出してコンソールイベントを生成するコンソールサブシステムであり、cmd.exeと子プロセスの両方で受信する必要があります。 cmd.exeには実行中の組み込みコマンド(例えばdir)を取り消し、終了しない複雑なハンドラがあります。子プロセスには、コンソール制御イベントが表示されたときに正常終了して状態を保存するロジックもあります。

+0

説明のためにBenに感謝します。しかし、解決策としては不明です。私はprocess.Startを使用してプロセスを作成することはできますが、動作しないと言っています。ワーカースレッドもありますが、どちらもうまくいかないと思います。あなたが提案していることの例を挙げることはできますか? –

+0

@ LostMan:特定の状況では、入出力のリダイレクト時にコンソールコントロールイベントを使用することは全く不可能かもしれません。 'cmd.exe'を通常起動すると、その入出力がコンソールオブジェクトになります。親プロセスがコンソールアプリケーションであれば、cmd.exeは同じコンソールを使用して起動し、親プロセスプロセスはコンソール制御イベントを送信できます。親プロセスがコンソールを持っていない場合、 'cmd.exe'は新しいものを取得し、親プロセスとは共有しません。だから私の回避策は、コンソールを持っているプロセスからcmd.exeを起動することです。 –

+0

コンソールアプリケーションをラッパーとして作成し、そのcmd、exeを起動できます。データをラッパーからWindowsフォームアプリケーションに戻すのは簡単です。親コンソールアプリでイベントを発生させるべきかどうかはどうですか? –

関連する問題