8

目的は、Windows フォームをプログラムで開始し、そのハンドルを取得し、Win Api の SendMessage() 関数を使用してその wndProc() 関数に情報を送信することです。

SendMessage() の部分は処理されましたが、問題はプロセスが開始された後にフォームのハンドルを取得することです。

私が最初に推測したのは、Process の MainWindowHandle プロパティが探しているハンドルを取得するということでしたが、プロセスを開始した後、MainWindowHandle は 0 のままであり、次のコードは開始したばかりのプロセスのハンドルを示していません。

foreach (Process p in Process.GetProcesses())
{
Console.WriteLine(p.MainWindowHandle);
}

これを行う方法と、実際に実行できるかどうかを誰かに教えてもらえますか?

4

1 に答える 1

9

プロセスがすべてをセットアップするのに1秒かかることもありますが、オブジェクトはすぐに返されます。

そのため、プロセスを実際に開始するには、少し待つ必要があります。そうすると、MainWindowHandleが適切に設定され、使用できるようになります。

var proc = Process.Start("notepad");

Thread.Sleep(1000); // This will wait 1 second

var handle = proc.MainWindowHandle;

よりスマートな方法でそれを行う別の方法は次のとおりです。

var proc = Process.Start("notepad");

try
{
    while (proc.MainWindowHandle == IntPtr.Zero)
    {
        // Discard cached information about the process
        // because MainWindowHandle might be cached.
        proc.Refresh();

        Thread.Sleep(10);
    }

    var handle = proc.MainWindowHandle;
}
catch
{
    // The process has probably exited,
    // so accessing MainWindowHandle threw an exception
}

これにより、プロセスが開始され、MainWindowHandleが空でなくなるまで待機します。

于 2012-06-03T04:51:42.097 に答える