Recuperación de un identificador de ventana (HWND)
En este tema se muestra cómo recuperar el identificador de ventana, de una ventana, en una aplicación de escritorio. El ámbito abarca aplicaciones de WinUI 3, Windows Presentation Foundation (WPF) y Windows Forms (WinForms); los ejemplos de código se presentan en C# y C++/WinRT.
Los marcos de desarrollo y de UI enumerados anteriormente se basan (en segundo plano) en la API de Win32. En Win32, un objeto de ventana se identifica mediante un valor conocido como identificador de ventana. Y el tipo de un identificador de ventana es un HWND (aunque se muestra en C# como IntPtr). En cualquier caso, escuchará el término HWND usado como abreviatura para el identificador de ventana.
Hay varias razones para recuperar el HWND para una ventana en la aplicación de escritorio WinUI 3, WPF o WinForms. Un ejemplo es usar el HWND para interoperar con determinados objetos de Windows Runtime (WinRT) que dependen de CoreWindow para mostrar una interfaz de usuario (UI). Para obtener más información, consulte Visualización de objetos de la interfaz de usuario de WinRT que dependen de CoreWindow.
WinUI 3 con C#
El código siguiente de C# muestra cómo recuperar el identificador de ventana (HWND) para un objeto Window de WinUI 3. En este ejemplo se llama al método GetWindowHandle en la clase de interoperabilidad de C# WinRT.Interop.WindowNative. Para obtener más información sobre las clases de interoperabilidad de C#, consulte Llamada a las API de interoperabilidad desde una aplicación con .NET.
// MainWindow.xaml.cs
private async void myButton_Click(object sender, RoutedEventArgs e)
{
// Retrieve the window handle (HWND) of the current WinUI 3 window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}
WinUI 3 con C++
El código siguiente de C++/WinRT muestra cómo recuperar el identificador de ventana (HWND) para un objeto Window de WinUI 3. En este ejemplo se llama al método IWindowNative::get_WindowHandle.
// pch.h
...
#include <microsoft.ui.xaml.window.h>
// MainWindow.xaml.cpp
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
// Retrieve the window handle (HWND) of the current WinUI 3 window.
auto windowNative{ this->m_inner.as<::IWindowNative>() };
HWND hWnd{ 0 };
windowNative->get_WindowHandle(&hWnd);
}
WPF con C#
El código siguiente de C# muestra cómo recuperar el identificador de ventana (HWND) para un objeto de ventana de WPF. En este ejemplo se usa la clase WindowInteropHelper.
// MainWindow.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
var wih = new System.Windows.Interop.WindowInteropHelper(this);
var hWnd = wih.Handle;
}
WinForms con C#
El código siguiente de C# muestra cómo recuperar el identificador de ventana (HWND) para un objeto de formulario WinForms. En este ejemplo se usa la propiedad NativeWindow.Handle.
// Form1.cs
private void button1_Click(object sender, EventArgs e)
{
var hWnd = this.Handle;
}