如何在 C# 中获取进程的主窗口句柄

本文关键字:取进程 窗口句柄 获取 | 更新日期: 2023-09-27 18:36:04

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

我得到了 SendMessage() 部分的处理,但现在的问题是在进程启动后获取表单的句柄。

我的第一个猜测是进程的 MainWindowHandle 属性会为我提供我正在寻找的句柄,但在我启动进程后,主窗口句柄仍然等于 0,并且以下代码不显示我刚刚启动的进程的句柄:

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

有人可以告诉我如何做到这一点以及它是否真的可以做到吗?

如何在 C# 中获取进程的主窗口句柄

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

出于这个原因,你应该等待一会儿,以便让进程真正启动它,然后它的 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 不为空。