Condividi tramite


Recuperare un handle di finestra (HWND)

Questo argomento illustra come, in un'app desktop, recuperare l'handle della finestra per una finestra. L'ambito riguarda le app di WinUI 3, Windows Presentation Foundation (WPF) e Windows Form (WinForms); gli esempi di codice sono presentati in C# e C++/WinRT.

I framework di sviluppo e interfaccia utente elencati in precedenza sono basati (in background) su API Win32. In Win32 un oggetto finestra viene identificato da un valore noto come handle di finestra. E il tipo di handle di finestra è un HWND (sebbene emerga in C# come IntPtr). In ogni caso, spesso si fa riferimento al termine HWND come abbreviazione di handle di finestra.

Esistono diversi motivi per recuperare HWND per una finestra nell'app desktop WinUI 3, WPF o WinForms. Un esempio consiste nell'usare HWND per interagire con determinati oggetti Windows Runtime (WinRT) che dipendono da CoreWindow per visualizzare un'interfaccia utente. Per altre informazioni, consultare Visualizzare gli oggetti dell'interfaccia utente WinRT che dipendono da CoreWindow.

WinUI 3 con C#

Il codice C# seguente illustra come recuperare l'handle di finestra (HWND) per un oggetto Finestra WinUI 3. In questo esempio viene chiamato il metodo GetWindowHandle nella classe di interoperabilità C# WinRT.Interop.WindowNative. Per altre informazioni sulle classi di interoperabilità C#, vedere Chiamare le API interop da un'app .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 con C++

Il codice C++/WinRT seguente illustra come recuperare l'handle di finestra (HWND) per un oggetto Finestra WinUI 3. In questo esempio viene chiamato il metodo 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 con C#

Il codice C# seguente illustra come recuperare l'handle di finestra (HWND) per un oggetto finestra WPF. In questo esempio viene utilizzata la 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 con C#

Il codice C# seguente illustra come recuperare l'handle di finestra (HWND) per un oggetto modulo WinForms. In questo esempio viene utilizzata la proprietà NativeWindow.Handle.

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

Determinazione della finestra che ospita un elemento visivo

Da un elemento visivo puoi accedere a UIElement.XamlRoot, quindi XamlRoot.ContentIslandEnvironment, quindi la proprietà ContentIslandEnvironment.AppWindowId contiene l'ID dell'HWND Win32 di primo livello.