Récupérer un handle de fenêtre (HWND)

Cette rubrique vous montre comment, dans une application de bureau, récupérer le handle de fenêtre d’une fenêtre. L’étendue couvre les applications Bibliothèque d’interface utilisateur Windows (WinUI) 3, Windows Presentation Foundation (WPF) et Windows Forms (WinForms) ; des exemples de code sont présentés en C# et C++/WinRT.

Les infrastructures de développement et d’interface utilisateur répertoriées ci-dessus sont (en arrière-plan) basées sur l’API Win32. Dans Win32, un objet de fenêtre est identifié par une valeur appelée handle de fenêtre. Et le type d’une poignée de fenêtre est un HWND (bien qu’il soit exposé en C# en tant qu’IntPtr). Dans tous les cas, vous entendrez le terme HWND utilisé comme raccourci pour le handle de fenêtre.

Il existe plusieurs raisons de récupérer le HWND pour une fenêtre dans votre application de bureau WinUI 3, WPF ou WinForms. Par exemple, utilisez le HWND pour interagir avec certains objets Windows Runtime (WinRT) qui dépendent d’un CoreWindow pour afficher une interface utilisateur . Pour plus d’informations, consultez Afficher les objets d’interface utilisateur WinRT qui dépendent de CoreWindow.

WinUI 3 avec C#

Le code C# ci-dessous montre comment récupérer le handle de fenêtre (HWND) pour un objet Windows WinUI 3. Cet exemple appelle la méthode GetWindowHandle sur la classe d’interopérabilité C# WinRT.Interop.WindowNative . Pour plus d’informations sur les classes d’interopérabilité C#, consultez Appeler des API d’interopérabilité à partir d’une application .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 avec C++

Le code C++/WinRT ci-dessous montre comment récupérer le handle de fenêtre (HWND) pour un objet Window WinUI 3. Cet exemple appelle la méthode 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 avec C#

Le code C# ci-dessous montre comment récupérer le handle de fenêtre (HWND) pour un objet de fenêtre WPF. Cet exemple utilise 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 avec C#

Le code C# ci-dessous montre comment récupérer le handle de fenêtre (HWND) pour un objet de formulaire WinForms. Cet exemple utilise la propriété NativeWindow.Handle .

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