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

有时,进程需要一秒钟来设置所有内容,但对象会立即返回。

出于这个原因,您应该稍等片刻,以便让 Process 真正启动它,然后它的 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 回答