2010-11-30 67 views
0

你好家伙
我正在做一个小应用程序,其中我需要枚举特定进程的所有窗口。
我没做到这一点,但通过枚举所有的窗口系统,然后只是测试,如果它是我谈论或不使用vb.net/pinvoke:枚举特定的进程窗口

GetWindowThreadProcessId(hwnd, proc) 
Dim _Process = Process.GetProcessById(proc) 
Dim _name = _Process.ProcessName 
If (_name = "ProcessName") then 

但这种方法的过程似乎采取了很多不必要的时间 是否有一个wind32函数,可以让我枚举特定进程的窗口并给出它的句柄。 谢谢。

+0

这是因为你在显示器上看到的几乎都是'窗口'(即:有一个HWND和自己的事件队列等)。汉斯首先获得进程的方法'线程,然后枚举Windows *每线程*更有效。 – dguaraglia 2010-11-30 15:24:45

回答

1

您已经在使用GetWindowThreadProcessId()。该函数返回一个线程ID,您可以将它与EnumThreadWindows()一起使用,以获取该线程拥有的所有顶层窗口。如有必要,EnumChildWindows()会为您提供每个顶层窗口所拥有的子窗口。

此方法不会为您提供可能由进程中的任何其他线程拥有的窗口。然而,这很罕见,你通常不想知道它们。如果这是一个挂断,那么使用Process.Threads来枚举进程中的所有线程,ProcessThread.Id会为您提供线程标识。