Partilhar via


Recuperar um identificador de janela (HWND)

Este tópico mostra como, numa aplicação de ambiente de trabalho, recuperar o identificador de janela de uma janela. O escopo abrange WinUI 3, Windows Presentation Foundation (WPF)e Windows Forms (WinForms) aplicativos; 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 no Win32 API. No contexto do Win32, o objeto de janela é identificado por um valor conhecido por identificador de janela . E o tipo de manipulador de janela é um HWND (embora seja apresentado em C# como um IntPtr). Em qualquer caso, você ouvirá o termo HWND usado como uma abreviação para alça de janela.

Há vários motivos para recuperar o HWND para uma janela em seu aplicativo de desktop 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 de utilizador (UI). Para saber mais, consulte Visualizar objetos da interface de utilizador 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 WinUI 3 Window. Este exemplo chama o método GetWindowHandle na classe de interoperabilidade C# WinRT.Interop.WindowNative. Para saber mais sobre as classes de interoperabilidade C#, veja chamar 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ó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 identificador de janela (HWND) para um objeto de janela WPF. Este exemplo usa a classeWindowInteropHelper.

// 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 WinForms. Este exemplo usa a propriedadeNativeWindow.Handle.

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

Determinar a janela que hospeda um elemento visual

A partir de um elemento visual, você pode acessar UIElement.XamlRoot; em seguida, XamlRoot.ContentIslandEnvironment; por último, a propriedade ContentIslandEnvironment.AppWindowId contém a ID do HWND Win32 de nível superior.