2012-05-20 31 views
42

Mi aplicación WPF tiene más de una ventana, necesito poder obtener el hWnd de cada instancia de Windows para que pueda usarlas en las llamadas a la API de Win32.¿Cómo obtener la instancia de hWnd of Window?

Ejemplo de lo que me gustaría hacer:

Window myCurrentWindow = Window.GetWindow(this); 
IntPtr myhWnd = myCurrentWindow.hWnd; // Except this property doesn't exist. 

Cuál es la mejor manera de hacer esto?

+2

posible duplicado de [¿Es posible obtener el Hwnd de un control emergente WPF?] (Http://stackoverflow.com/questions/7815121/is-it-possible-to-get-the-hwnd-of- a-wpf-popup-control) –

+2

@HansPassant: La otra pregunta se refería a los controles emergentes, no a las ventanas reales. (Sí, esta pregunta también fue respondida indirectamente dentro de ella, pero no es un duplicado). – Douglas

Respuesta

58

WindowInteropHelper es tu amigo. Tiene un constructor que acepta un parámetro Window y una propiedad Handle que devuelve su identificador de ventana.

Window window = Window.GetWindow(this); 
var wih = new WindowInteropHelper(window); 
IntPtr hWnd = wih.Handle; 
9

Extendiéndose sobre la respuesta de Douglas, si el Window no se ha demostrado, sin embargo, no podría tener un HWND. Puede forzar a un ser creado antes de que aparezca la ventana usando EnsureHandle():

var window = Window.GetWindow(element); 

IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle(); 

Tenga en cuenta que puede volver Window.GeWindownull, lo que realmente debe probar que también.

Cuestiones relacionadas