1

プロセスがまだ生きているかどうかを判断しようとしています (確認した時点では、確認を行った直後にプロセスを閉じることができることを認識していWaitForSingleObject()ます) Process.MainWindowHandle。そして_IsIconic()WAIT_FAILEDGetLastError()ERROR_INVALID_HANDLE

UInt32 r = WaitForSingleObject(handle, 0);
if(r == WAIT_OBJECT_0)
{
    MessageBox.Show("still running!");
}
if(r == WAIT_FAILED)
{
    throw new Win32Exception(Marshal.GetLastWin32Error());
}
4

1 に答える 1

5

ウィンドウ ハンドルを待機することはできません。などのウィンドウ関連の関数にウィンドウ ハンドルを渡すことができますIsIconic()が、それらはカーネル オブジェクトではないため、待機することはできません。ドキュメントには、待機できるオブジェクトのリストが記載されています。

WaitForSingleObject 関数は、次のオブジェクトを待機できます。

  • 変更通知
  • コンソール入力
  • イベント
  • メモリ リソースの通知
  • ミューテックス
  • プロセス
  • セマフォ
  • スレッド
  • 待機可能タイマー

したがって、プロセスが終了するまで待機する場合は、プロパティを介してアクセスできるプロセスのハンドルを待機できProcess.Handleます。

しかし、実際には Win32 関数を P/Invoke する必要はまったくありません。.NETProcessラッパー クラスには、プロセスを待機するために使用できるWaitForExit()およびメンバー関数があります (両方とも、タイムアウト値を取得するオーバーロードがあることに注意してください)。WaitForInputIdle()

これがProcessクラス ラッパーを使用して開始したプロセスである場合は、単純にプロパティを調べることができProcess.HasExitedます。

于 2016-06-24T17:23:00.583 に答える