Abrufen eines Fensterhandles (HWND)

In diesem Thema erfahren Sie, wie Sie in einer Desktop-App das Fensterhandle für ein Fenster abrufen. Der Bereich umfasst Windows UI Library (WinUI) 3, Windows Presentation Foundation (WPF) und Windows Forms -Apps (WinForms). Codebeispiele werden in C# und C++/WinRT vorgestellt.

Die oben aufgeführten Entwicklungs- und Benutzeroberflächenframeworks basieren (im Hintergrund) auf der Win32-API. In Win32 wird ein Fensterobjekt durch einen Wert identifiziert, der als Fensterhandle bezeichnet wird. Und der Typ eines Fensterziehpunkts ist ein HWND (obwohl er in C# als IntPtr angezeigt wird). In jedem Fall hören Sie den Begriff HWND , der als Kurzform für das Fensterhandle verwendet wird.

Es gibt mehrere Gründe, den HWND für ein Fenster in Ihrer WinUI 3-, WPF- oder WinForms-Desktop-App abzurufen. Ein Beispiel ist die Verwendung des HWND, um mit bestimmten Windows-Runtime -Objekten (WinRT) zu interagieren, die von einem CoreWindow abhängig sind, um eine Benutzeroberfläche (UI) anzuzeigen. Weitere Informationen finden Sie unter Anzeigen von WinRT-UI-Objekten, die von CoreWindow abhängen.

WinUI 3 mit C#

Der folgende C#-Code zeigt, wie Sie das Fensterhandle (HWND) für ein WinUI 3 Window-Objekt abrufen. In diesem Beispiel wird die GetWindowHandle-Methode für die WinRT.Interop.WindowNative C#-Interop-Klasse aufgerufen. Weitere Informationen zu den C#-Interopklassen finden Sie unter Aufrufen von Interop-APIs aus einer .NET-App.

// 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 mit C++

Der folgende C++/WinRT-Code zeigt, wie Sie das Fensterhandle (HWND) für ein WinUI 3 Window-Objekt abrufen. In diesem Beispiel wird die IWindowNative::get_WindowHandle-Methode aufgerufen.

// 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 mit C#

Der folgende C#-Code zeigt, wie Sie das Fensterhandle (HWND) für ein WPF-Fensterobjekt abrufen. In diesem Beispiel wird die WindowInteropHelper-Klasse verwendet.

// MainWindow.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
    var wih = new System.Windows.Interop.WindowInteropHelper(this);
    var hWnd = wih.Handle;
}

WinForms mit C#

Der folgende C#-Code zeigt, wie Sie das Fensterhandle (HWND) für ein WinForms-Formularobjekt abrufen. In diesem Beispiel wird die NativeWindow.Handle-Eigenschaft verwendet.

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