目的是使用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/