Partager via


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

Cette rubrique décrit comment, dans une application de bureau, récupérer un handle de fenêtre. Il englobe les applications WinUI 3, Windows Presentation Foundation (WPF) et Windows Forms (WinForms), et les exemples de code sont présentés en C# et C++/WinRT.

Les frameworks de développement et d’interface utilisateur répertoriés ci-dessus sont basés (en arrière-plan) sur l’API Win32. Dans Win32, un objet fenêtre est identifié par une valeur dénommée handle de fenêtre. Et le handle de fenêtre est de type HWND (bien qu’il s’affiche en C# en tant que IntPtr). Dans tous les cas, le terme HWND est utilisé comme raccourci pour 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. Un exemple consiste à utiliser le HWND pour interagir avec certains objets Windows Runtime (WinRT) qui dépendent d’un CoreWindow pour afficher une interface utilisateur (UI). Pour en savoir plus, reportez-vous à 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 Window 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 WinUI 3. 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 WinForm. Cet exemple utilise la propriété NativeWindow.Handle.

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

Détermination de la fenêtre qui héberge un élément visuel

À partir d’un élément visuel, vous pouvez accéder à UIElement.XamlRoot ; puis XamlRoot.ContentIslandEnvironment, puis la propriété ContentIslandEnvironment.AppWindowId contient l’ID du HWND Win32 de niveau supérieur.