Udostępnij za pośrednictwem


Pobierz uchwyt okna (HWND)

W tym temacie pokazano, jak w aplikacji na pulpit pobrać uchwyt okna. Zakres obejmuje WinUI 3, Windows Presentation Foundation (WPF) i Windows Forms (WinForms); przykłady kodu są prezentowane w języku C# i C++/WinRT.

Wymienione powyżej struktury programowania i interfejsu użytkownika są (w tle) oparte na interfejsie API Win32. W systemie Win32 obiekt okna jest identyfikowany przez wartość znaną jako uchwyt okna. Typ uchwytu okna to HWND (chociaż w języku C# widoczny jest jako IntPtr). W każdym razie usłyszysz termin HWND używany jako skrót do obsługi okien.

Istnieje kilka powodów pobierania HWND okna w aplikacji klasycznej WinUI, WPF lub WinForms. Przykładem jest użycie HWND do współdziałania z określonymi obiektami Windows Runtime (WinRT), które zależą od CoreWindow do wyświetlania interfejsu użytkownika. Aby uzyskać więcej informacji, zobacz Wyświetlanie obiektów interfejsu użytkownika WinRT, które zależą od coreWindow.

WinUI z językiem C#

Poniższy kod języka C# pokazuje, jak pobrać uchwyt okna (HWND) dla obiektu okna WinUI. W tym przykładzie wywoływana jest metoda GetWindowHandle w klasie międzyoperacyjnej WinRT.Interop.WindowNative C#. Aby uzyskać więcej informacji na temat klas międzyoperacyjności języka C#, zobacz Wywołanie interfejsów API z aplikacji .NET.

// MainWindow.xaml.cs
private async void myButton_Click(object sender, RoutedEventArgs e)
{
    // Retrieve the window handle (HWND) of the current WinUI window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}

WinUI z językiem C++

Poniższy kod C++/WinRT pokazuje, jak uzyskać uchwyt okna (HWND) dla obiektu Window w WinUI. W tym przykładzie wywoływana jest metoda 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 window.
    auto windowNative{ this->m_inner.as<::IWindowNative>() };
    HWND hWnd{ 0 };
    windowNative->get_WindowHandle(&hWnd);
}

WPF z językiem C#

Poniższy kod C# pokazuje, jak uzyskać uchwyt okna (HWND) dla obiektu okna WPF. W tym przykładzie użyto klasy WindowInteropHelper .

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

Formularze WinForm z językiem C#

Poniższy kod w języku C# pokazuje, jak uzyskać uchwyt okna (HWND) dla obiektu formularza WinForms. W tym przykładzie użyto właściwości NativeWindow.Handle .

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

Określanie okna obsługującego element wizualizacji

Z wizualnego elementu można uzyskać dostęp do UIElement.XamlRoot; następnie do XamlRoot.ContentIslandEnvironment, a potem właściwość ContentIslandEnvironment.AppWindowId zawiera identyfikator najwyższego poziomu Win32 HWND.