Partilhar via


Recuperar um identificador de janela (HWND)

Este tópico mostra-lhe como, numa aplicação de ambiente de trabalho, recuperar o handle de uma janela. O âmbito abrange aplicações WinUI 3, Windows Presentation Foundation (WPF) e Windows Forms (WinForms); exemplos de código são apresentados em C# e C++/WinRT.

Os frameworks de desenvolvimento e UI listados acima são (nos bastidores) construídos sobre a API Win32. No Win32, um objeto janela é identificado por um valor conhecido como alavanca de janela. E o tipo de manipulador de janela é um HWND (embora apareça em C# como um IntPtr). De qualquer forma, ouvirá o termo HWND usado como abreviação para maçaneta de janela.

Existem várias razões para recuperar o HWND para uma janela na sua aplicação de desktop WinUI, WPF ou WinForms. Um exemplo é usar o HWND para interoperar com certos objetos Windows Runtime (WinRT) que dependem de um CoreWindow para exibir uma interface de utilizador (UI). Para mais informações, consulte Exibir objetos da interface WinRT que dependem do CoreWindow.

WinUI com C#

O código C# abaixo mostra como recuperar o handle da janela (HWND) para um objeto WinUI Window . Este exemplo chama o método GetWindowHandle na classe de interop WinRT.Interop.WindowNative C#. Para mais informações sobre as classes de interoperabilidade em C#, veja Call APIs de interoperabilidade a partir de uma aplicação .NET.

// MainWindow.xaml.cs
private async void myButton_Click(object sender, RoutedEventArgs e)
{
    // Retrieve the window handle (HWND) of the current WinUI window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}

WinUI com C++

O código C++/WinRT abaixo mostra como recuperar o handle da janela (HWND) para um objeto WinUI 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 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 handle de janela (HWND) para um objeto de janela WPF. Este exemplo utiliza 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 handle da janela (HWND) para um objeto de formulário WinForms. Este exemplo utiliza a propriedade NativeWindow.Handle .

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

Determinar a janela que alberga um elemento visual

A partir de um elemento visual, pode aceder UIElement.XamlRoot; depois XamlRoot.ContentIslandEnvironment; depois a propriedade ContentIslandEnvironment.AppWindowId contém o ID do HWND de topo da Win32.