目的是使用Win Api的SendMessage()函数以编程方式启动Windows窗体,获取其句柄并将信息发送到其wndProc()函数。

我已处理好SendMessage()部分,但现在的问题是在过程开始后获取表单的句柄。

我的第一个猜测是Process的MainWindowHandle属性将为我寻找所需的句柄,但是启动进程后MainWindowHandle保持等于0,并且以下代码未显示我刚刚启动的进程的句柄:

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

有人可以告诉我如何执行此操作以及是否可以实际执行吗?

最佳答案

有时,该过程花了一秒钟的时间完成了所有设置,但是该对象立即被返回。

因此,您应该稍等片刻,以便让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不为空。

关于c# - 如何在C#中获取Process的主窗口句柄?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10867501/

10-14 10:50