Поделиться через


Получение дескриптора окна (HWND)

В этом разделе показано, как в классическом приложении получить дескриптор окна для окна. Область охватывает приложения WinUI 3, Windows Presentation Foundation (WPF) и Приложения Windows Forms (WinForms), примеры кода представлены в C# и C++/WinRT.

Перечисленные выше платформы разработки и пользовательского интерфейса основаны на API Win32. В Win32 объект окна определяется значением, известным как дескриптор окна. А тип дескриптора окна — это HWND (хотя он отображается в C# как IntPtr). В любом случае вы услышите термин HWND , используемый как сокращенный для дескриптора окна.

Существует несколько причин получения HWND для окна в классическом приложении WinUI 3, WPF или WinForms. Одним из примеров является использование HWND для взаимодействия с определенными объектами среда выполнения Windows (WinRT), зависящими от CoreWindow, для отображения пользовательского интерфейса. Дополнительные сведения см. в разделе "Отображение объектов пользовательского интерфейса WinRT", зависящих от CoreWindow.

WinUI 3 с C#

Приведенный ниже код C# показывает, как получить дескриптор окна (HWND) для объекта Окна WinUI 3. В этом примере вызывается метод GetWindowHandle в классе взаимодействия WinRT.Interop.WindowNative C#. Дополнительные сведения о классах взаимодействия C# см. в разделе API взаимодействия вызовов из приложения .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 с C++

Приведенный ниже код C++/WinRT показывает, как получить дескриптор окна (HWND) для объекта Окна WinUI 3. В этом примере вызывается метод 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 с C#

Приведенный ниже код C# показывает, как получить дескриптор окна (HWND) для объекта окна WPF. В этом примере используется класс 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 с C#

Приведенный ниже код C# показывает, как получить дескриптор окна (HWND) для объекта формы WinForms. В этом примере используется свойство NativeWindow.Handle .

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