Partilhar via


Recuperar um identificador de janela (HWND)

Este tópico mostra-lhe como, numa aplicação desktop, recuperar o identificador 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 3, WPF ou WinForms. Um exemplo é usar o HWND para interoperar com certos objetos do Windows Runtime (WinRT) que dependem de um CoreWindow para mostrar uma interface de utilizador (UI). Para mais informações, consulte Exibir objetos da interface WinRT que dependem do CoreWindow.

WinUI 3 com C#

O código C# abaixo mostra como recuperar o handle da janela (HWND) para um objeto WinUI 3 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 APIs de interoperação de chamadas 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 3 window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}

WinUI 3 com C++

O código C++/WinRT abaixo mostra como recuperar o handle de janela (HWND) para um objeto Window 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 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 ao UIElement.XamlRoot; depois XamlRoot.ContentIslandEnvironment; depois, a propriedade ContentIslandEnvironment.AppWindowId contém o ID do HWND Win32 de topo.