Compartilhar via


Recuperar um identificador de janela (HWND)

Este tópico ensina como recuperar o identificador de janela de uma janela em um aplicativo de desktop. O escopo abrange aplicativos WinUI 3, Windows Presentation Foundation (WPF) e WinForms (Windows Forms ). 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) criadas na API Win32. No Win32, um objeto de janela é identificado por um valor conhecido como identificador de janela. E o tipo de identificador de janela é um HWND (embora ele seja exibido em C# como um IntPtr). Em qualquer caso, você ouvirá o termo HWND usado como uma abreviação para o identificador de janela.

Há vários motivos 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 WinRT (Windows Runtime) que dependem de um CoreWindow para exibir uma interface do usuário (interface do usuário). Para obter mais informações, consulte Exibir objetos de interface do usuário do WinRT que dependem do CoreWindow.

WinUI 3 com C#

O código C# abaixo mostra como recuperar o HWND (identificador de janela) para um objeto WinUI 3 Window . 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 do C#, consulte APIs de interoperabilidade de chamadas 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ódigo C++/WinRT abaixo mostra como recuperar o identificador de janela (HWND) para um objeto WinUI 3 Window . 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 HWND (identificador de janela) para um objeto de 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 HWND (identificador de janela) para um objeto de formulário WinForms. Este exemplo usa a propriedade NativeWindow.Handle .

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

Determinando a janela que está hospedando um elemento visual

Em um elemento visual, você pode acessar UIElement.XamlRoot; então XamlRoot.ContentIslandEnvironment; então a propriedade ContentIslandEnvironment.AppWindowId contém a ID do Win32 HWND de nível superior.