C#启动进程后获取窗口句柄

11

在使用C#的Process.Start()启动一个窗口后,有没有办法获取该窗口的窗口句柄(IntPtr)?


进程 p = Process.Start("Notepad"); p.WaitForInputIdle(); SetParent(p.MainWindowHandle, CBox.Handle); - Ebrahim Karam
4个回答

27

8

使用

process.MainWindowHandle;

在启动应用程序时,它可能为0,因此您可能希望循环并休眠直到其填满。


1
嗨Jan, 对我来说,句柄始终为零,即使无限循环也不会变成其他值。我使用以下代码:proc.StartInfo.FileName = @"C:\Documents and Settings\SUM\Desktop\PortableApps\Notepad++Portable\Notepad++Portable.exe"; proc.StartInfo.Arguments = String.Empty; proc.Start(); IntPtr appHwnd = proc.MainWindowHandle; while (appHwnd == IntPtr.Zero) { Thread.Sleep(100); appHwnd = proc.MainWindowHandle; }有什么问题吗? - Marcel

6

这不是最新的话题,但答案是不完整的。

我赞同使用 Process.MainWindowHandle 解决方案,并等待该值的到来,但不赞成使用 Sleep。

如果您刚启动进程并希望使用其主窗口句柄,请考虑使用 WaitForInputIdle 方法来允许进程完成启动,确保已创建主窗口句柄。

Process.WaitForInputIdle

此重载仅适用于具有用户界面和消息循环的进程。


我认为这实际上应该是一条注释。 - Sri Harsha Chilakapati
很抱歉,由于某些原因,这个等待函数抛出了异常(只有一个),我将使用Sleep和Refresh来解决。 - Sam
Process.WaitForInputIdle 在 WPF 应用程序上使用时似乎几乎立即返回。我认为这是由于 WPF 内部机制所致... - Grahamvs
我的.NET 4.5应用程序几乎立即返回结果。之前的人说是WPF,但我的只是桌面应用程序。 - DAG

2
您可以在进程上调用Refresh()方法以确保信息准确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接