Recuperar um identificador de janela (HWND)

Este tópico mostra como recuperar o identificador de janela de uma janela em um aplicativo de área de trabalho. O escopo abrange aplicativos do WinUI 3, Windows Presentation Foundation (WPF) e Windows Forms (WinForms), e exemplos de código são apresentados em C# e C++/WinRT.

As estruturas de desenvolvimento e interface do usuário listadas acima são (nos bastidores) construídas na API do Win32. No Win32, um objeto janela é identificado por um valor conhecido como identificador de janela. E o tipo de maçaneta da janela é um HWND (embora apareça em C# como um IntPtr). De qualquer forma, você ouvirá o termo HWND usado como uma abreviação para identificador de janela.

Há várias razões para recuperar o HWND para uma janela em seu aplicativo de área de trabalho WinUI 3, WPF ou WinForms. Um exemplo é usar o HWND para interoperar com determinados objetos do Windows Runtime (WinRT) que dependem de um CoreWindow para exibir uma interface do usuário (UI). Para mais informações, consulte Exibir objetos da interface do usuário do WinRT que dependem do CoreWindow.

WinUI 3 com C#

O código C# abaixo mostra como recuperar o identificador de janela (HWND) para um objeto Janela do WinUI 3. Este exemplo chama o método GetWindowHandle na classe de interoperabilidade WinRT.Interop.WindowNative C#. Para obter mais informações sobre as classes de interoperabilidade C#, consulte Chame APIs de interoperabilidade de um aplicativo .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 com C++

O C++/WinRT abaixo mostra como recuperar o identificador de janela (HWND) para um objeto Janela do WinUI 3. Este exemplo chama o 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 com C#

O código C# abaixo mostra como recuperar o identificador de janela (HWND) para um objeto janela do WPF. Este exemplo usa a classe 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 com C#

O código C# abaixo mostra como recuperar o identificador de janela (HWND) para um objeto de formulário do WinForms. Este exemplo usa a propriedade NativeWindow.Handle.

// Form1.cs
private void button1_Click(object sender, EventArgs e)
{
    var hWnd = this.Handle;
}