2010-11-30 5 views
0

Hallo Leute
Ich mache eine kleine App, in der ich alle Fenster eines bestimmten Prozesses aufzählen muss.
ich es geschafft, das zu tun, aber ich spreche oder nicht alle Fenster in das System und dann nur testen, ob es der Prozessvb.net/pinvoke: Enum spezifische Prozessfenster

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

aber diese Methode unter Verwendung ist offenbar viel durch Aufzählen nehmen unnötige Zeit. gibt es eine wind32-Funktion, die es mir erlauben, die Fenster eines bestimmten Prozesses aufzuzählen, der seinen Griff gibt. danke.

+0

Das ist, weil so ziemlich alles, was Sie auf Ihrem Bildschirm sehen, "Windows" sind (d. H. Haben eine HWND und eigene Ereigniswarteschlange, etc.). Hans Ansatz, zuerst die Prozess-Threads zu bekommen und dann die Windows * per-Thread aufzuzählen, ist viel effizienter. – dguaraglia

Antwort

1

Sie verwenden bereits GetWindowThreadProcessId(). Diese Funktion gibt eine Thread-ID zurück. Sie können sie mit EnumThreadWindows() verwenden, um alle Toplevel-Fenster zu erhalten, die dem Thread gehören. Bei Bedarf ruft EnumChildWindows() die untergeordneten Fenster ab, die jedem Toplevel-Fenster gehören.

Dieser Ansatz gibt Ihnen keine Fenster, die möglicherweise von einem anderen Thread im Prozess gehört werden. Das ist jedoch ziemlich selten und Sie möchten normalerweise nicht über sie wissen. Wenn das ein Aufhängen ist, dann Process.Threads verwenden, um alle Threads in dem Prozess aufzuzählen, erhält ProcessThread.Id Sie die Thread-ID.