2010-03-20 9 views

Respuesta

23

Control.FromHandle

(que le consigue el objeto de control, que implementa la interfaz IWin32Window.)

Ej.

IntPtr myWindowHandle = IntPtr(someVal); 
IWin32Window^ w = Control::FromHandle(myWindowHandle); 

Tenga en cuenta que esto depende de que el identificador sea "adquirido desde la propiedad Handle de un formulario/control". No puede usar esta técnica con un identificador de ventana Win32 arbitrario.

+0

James, he editado una calificación en su respuesta porque las personas que vienen de una búsqueda más general en 'IntPtr' y' IWin32Window' solo pueden leer el título de la pregunta y no apreciar la restricción en los detalles de la pregunta. Espero que esto esté bien. – itowlson

+0

No, es una buena edición. Probablemente haya salvado a un desafortunado futuro programador de horas de rascarse la cabeza preguntándose por qué no puede crear mágicamente un objeto Control/IWin32Window desde un HWND en bruto. :) –

20

Hay un método más simple que es soportado directamente por .NET Framework sin tener que crear su propia clase personalizada. Puede usar esto con cualquier identificador de ventana arbitrario.

Dado ptrWindowHandle de tipo IntPtr:

using System.Windows.Forms; 

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

System.Windows.Forms.NativeWindow implementa la interfaz IWin32Window.

+14

También puede utilizar el estático 'NativeWindow.FromHandle (ptrWindowHandle);' –

+0

@MattSmith He encontrado que debe asignarse. FromHandle no funciona para mí a menos que se haya utilizado AssignHandle de antemano. Por ejemplo, esto funciona: 'NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle (GetConsoleWindow()); box.ShowDialog (NativeWindow.FromHandle (GetConsoleWindow())) '(o incluso' box.ShowDialog (nativeWindow); ') ... pero este one-liner sin la asignación no:' box.ShowDialog (NativeWindow. FromHandle (GetConsoleWindow())); ' – Jay

Cuestiones relacionadas