2010-03-20 8 views

Antwort

23

Control.FromHandle

(Das bringt Sie das Objekt Kontrolle, die die IWin32Window-Schnittstelle implementiert.)

Eg.

Beachten Sie, dass dies darauf beruht, dass das Handle "aus der Handle-Eigenschaft eines Formulars/Steuerelements abgerufen wird". Sie können diese Technik nicht mit einem beliebigen Win32-Fensterhandle verwenden.

+0

James, ich habe eine Qualifikation in deine Antwort geändert, weil Leute, die von einer allgemeineren Suche nach 'IntPtr' und' IWin32Window' kommen, den Titel der Frage nur lesen und die Einschränkung im Fragedetail nicht schätzen. Hoffe, das ist in Ordnung. – itowlson

+0

Nein, es ist ein guter Schnitt. Sie haben wahrscheinlich einige glücklose Programmierer aus der Zeit davor gerettet, sich zu wundern, warum er nicht magischerweise ein Control/IWin32Window-Objekt aus einem rohen HWND erstellen kann. :) –

20

Es gibt eine einfachere Methode, die direkt vom .NET Framework unterstützt wird, ohne dass Sie eine eigene benutzerdefinierte Klasse erstellen müssen. Sie können dies mit beliebigen beliebigen Fenstergriff verwenden.

ptrWindowHandle vom Typ Gegeben IntPtr:

using System.Windows.Forms; 

NativeWindow nativeWindow = new NativeWindow(); 
nativeWindow.AssignHandle(ptrWindowHandle); 

System.Windows.Forms.NativeWindow implementiert die IWin32Window Schnittstelle.

+14

Sie können auch einfach die statische 'NativeWindow.FromHandle (ptrWindowHandle);' –

+0

@MattSmith Ich habe festgestellt, dass es zugewiesen werden muss. FromHandle funktioniert nicht für mich, wenn AssignHandle nicht zuvor verwendet wurde. Zum Beispiel funktioniert das: 'NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle (GetConsoleWindow()); box.ShowDialog (NativeWindow.FromHandle (GetConsoleWindow())); '(oder sogar' box.ShowDialog (nativeWindow); ') ... aber dieser Einzeiler ohne die Zuweisung nicht:' box.ShowDialog (NativeWindow. FromHandle (GetConsoleWindow())); ' – Jay