2010-05-31 23 views
7
abrufen

Ich versuche, ein Fensterhandle auf einem untergeordneten Fenster in meinem Prozess zu erhalten, und die einzige Information, die ich habe, ist der Fensterklassenname. Gibt es irgendwelche Win32-Funktionen, die ich dafür verwenden kann? Ich mache das von C#.Fensterhandle vom Fensterklassennamen

Ein bisschen mehr Detail: Dies ist ein Visual Studio-Plugin, in C# geschrieben. Also mein Prozess ist Visual Studio, das viele Fenster hat. Einer von ihnen hat eine Fensterklasse "VsTipWindow". Ich kenne das unmittelbare Elternfenster dieses Fensters nicht, alles, was ich habe, ist der Klassenname. Gibt es eine Möglichkeit für mich, den Fenstergriff von genau diesem zu bekommen?

Antwort

0

Zunächst sollte beachtet werden, dass es keine 1 zu 1 Beziehung zwischen Fenstern und Fensterklassen gibt, mehr als ein Fenster könnte die gleiche Klasse verwenden.

Ich denke, Ihre einzige Option ist, EnumChildWindows rekursiv aufrufen, beginnend mit der obersten Ebene Visual Studio-Fenster (Oder ein anderes Fenster höher in der Fensterhierarchie, wenn Sie eine, die ein Großelternteil des VsTipWindow-Fensters ist) kennen EnumChildWindows würden Sie GetClassName aufrufen und die Zeichenfolge mit VsTipWindow vergleichen, bis Sie das Fenster finden.

Da Sie über unbekannte Eltern gesprochen haben, gehe ich davon aus, dass Sie nach einem Kind Fenster sind, aber wenn dieses Fenster ein Top Level Fenster ist, müssen Sie EnumWindows verwenden (Und Sie sollten wahrscheinlich GetWindowThreadProcessId verwenden, um sicherzustellen, dass Sie richtiger Prozess, nachdem Sie auch ein Fenster mit dem Klassennamen finden)

(ich bin sicher, dass .NET-Funktionen hat, die das gleiche wie das native api tun, oder man müßte PInvoke)

+1

Danke, das hat den Trick gemacht.Obwohl "EnumChildWindows recursivly" klar ist, rufen Sie es nur einmal mit dem Fensterhandle der obersten Ebene auf, die EnumChildWindows-Funktion selbst führt die Rekursion bereits durch. –

2

FindWindow ist der Win32-Aufruf, den Sie für dieses möchten (oder FindWindowEx, wenn mehr als ein Fenster mit diesem bestimmten Klassennamen vorhanden ist und FindWindow den gesuchten Wert nicht zurückgibt).

+0

Ich habe gerade bemerkt das 'findwindow'-Tag Ihrer Frage - gut vermuten. :) – MusiGenesis

+0

FindWindow findet nur Top-Level-Fenster, FindWindowEx ist das, was Sie wirklich meinen, ABER es ist sicherer, die Enum-Funktion aufzurufen, so dass Sie keine Fenster verpassen – Anders

+0

@Anders: bereits den FindWindowEx Link hinzugefügt. In den meisten Fällen gibt FindWindow das gewünschte Fenster zurück. Der sicherste Ansatz von allen ist es, nicht mit Windows-Klassennamen herumzuspielen. – MusiGenesis

0

ein Win32-Fenster class ist die generische Implementierung eines Steuerelements, das Handle des Windows ist die Instanz des Steuerelements. Sie haben also mehrere Fenstergriffe mit derselben Fensterklasse (z. B. EDIT). Streng genommen ist eine Fensterklasse der Zeiger auf die Fensterprozedur.

Frameworks wie. NET (und sogar MFC) neigen dazu, einige Fensterklasse für alle Windows-Steuerelemente zu teilen, und dann werden sie an die entsprechenden Steuerelemente (d. H. Sie haben eine einzige generische Fensterprozedur). Dies gilt auch für große Anwendungen wie Visual Studio oder Office.

So macht es sehr schwierig, ein bestimmtes Fenster nur durch seine Fensterklasse zu erkennen. Sie können jedoch alle Fenster mit einer spezifischen Windows-Klasse mit FindWindow aufzählen, Sie erhalten auch den Fenstertext, der Ihnen helfen kann. Mit GetWindowThreadProcessId können Sie feststellen, ob das Fenster zu Visual Studio gehört.

+0

Ok. Aber in diesem speziellen Fall weiß ich, dass es immer nur ein aktives Fenster mit dieser bestimmten Fensterklasse gibt, das ist also kein Problem. Ich hätte das wohl in der Frage sagen sollen :) –

1

nur zusätzliche Informationen ..
vielleicht nützlich es ist zu wissen, dass Sie den Griff eines Fensters von einem Punkt bekommen
Window
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

+1

WindowFromPoint gilt hier nicht, es sei denn, Sie schlagen vor, dass der Benutzer den Mauszeiger auf dieses Fenster zu einem bestimmten Zeitpunkt oder Ereignis zeigen muss! – Anders

+1

@Anders, VsTipWindow ist eine Art ToolTipWindow. Tooltipwindows haben die Eigenschaft, sichtbar zu sein, wenn sich die Maus über einem anderen Fenster befindet und verschwinden, wenn die Maus das Fenster verlässt. aber nichtsdestotrotz hat WindowFromPoint nichts mit dem Mauspunkt selbst zu tun. es liefert einen Fenstergriff von jedem beliebigen Punkt. Wenn es hier gilt oder nicht ist nicht die Frage, lies bitte meine ersten 3 Wörter. Ich möchte nur eine andere Idee geben, nur für den Fall, dass Einars erste Idee nicht funktionieren wird. wir wissen nicht einmal, was er vorhat – OlimilOops