2009-02-18 16 views
24

Ich habe die folgende Klasse deklariert:Immer den Griff des Fensters in C#

public partial class MainWindow : Window 

Und ich brauche den eigentlichen Griff des Fensters zu erhalten, sobald das Fenster einen hat. Wie kann ich das tun und wo sollte ich die Abfrage-Funktion setzen.

Was ich bisher versucht:

IntPtr hwnd = new WindowInteropHelper(this).Handle; 

Aber der Griff ich zurück ist 0, weil es in OnInitialized gepflanzt werden könnte - vielleicht das Fenster noch zu diesem Zeitpunkt nicht bereit ist. Und, ja - es ist über WPF verbunden, danke, dass Sie darauf hingewiesen haben!

Dank

+0

WPF oder winforms? –

+0

Sollen wir annehmen, dass "WindowInteropHelper" vom Typ System.Windows.Forms.Form ist? –

+0

Von ihrer Verwendung von WindowInteropHelper denke ich, es ist WPF (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx) –

Antwort

25

Im OnInitialized Methode der Griff wurde noch nicht erstellt worden. Aber du bist auf dem richtigen Weg. Wenn Sie Ihren Anruf in die Loaded Veranstaltung der Handle wird erstellt wurden, und es sollte die richtige Handle zurückgeben.

0
[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern int FindWindowEx(int hwndParent, int hwndEnfant, int lpClasse, string lpTitre); 


int hwnd = FindWindowEx(0, 0, 0, title);//where title is the windowtitle 

       //verification of the window 
       if (hwnd == 0) 
       { 
        throw new Exception("Window not found"); 
       } 
+0

Mez, das funktioniert für WPF? –

+3

In dem ursprünglichen Post versucht das Poster, das Handle abzurufen, bevor es erstellt wird, daher wird diese Methode auch immer fehlschlagen. Die meisten Int-Parameter sollten IntPtr sein, auf einer 64-Bit-Plattform wird dies spektakulär ausfallen. Schließlich wird nur Top-Level-Fenster gesucht. –

6

Der früheste Ort, an dem Sie den Griff bekommen können, ist OnSourceInitialized