擷取視窗控制代碼 (HWND)
本主題說明如何在傳統型應用程式中擷取視窗控制代碼。 範圍涵蓋 WinUI 3、Windows Presentation Foundation (WPF) 和 Windows Forms (WinForms) 應用程式;程式碼範例會以 C# 和 C++/WinRT 顯示。
以上所列的開發與 UI 架構是在 Win32 API 上建置的 (幕後)。 在 Win32 中,視窗物件是由已知的視窗控制代碼值來識別的。 視窗控制代碼的類型為 HWND (雖然其在 C# 會以 IntPtr 表現)。 在任何情況下,您都會聽到將 HWND 一詞做為視窗控制代碼的簡稱。
在 WinUI 3、WPF 或 WinForms 傳統型應用程式中擷取視窗的 HWND 有幾個原因。 其中一個範例是使用 HWND 來與相依於 CoreWindow 的特定 Windows 執行階段 (WinRT) 物件互通,以顯示使用者介面 (UI)。 有關詳細資訊,請參閱顯示相依於 CoreWindow 的 WinRT UI 物件。
使用 C# 的 WinUI 3
下列 C# 程式碼顯示如何擷取 WinUI 3 視窗物件的視窗控制代碼 (HWND)。 這個範例會在 WinRT.Interop.WindowNative C# Interop 類別中呼叫 GetWindowHandle。 如需 C# Interop 類別的詳細資訊,請參閱從 .NET 應用程式呼叫 Interop API。
// 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);
}
使用 C++ 的 WinUI 3
下列 C++/WinRT 程式碼顯示如何擷取 WinUI 3 視窗物件的視窗控制代碼 (HWND)。 這個範例會呼叫 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);
}
使用 C# 的 WPF
下列 C# 程式碼顯示如何擷取 WPF 視窗物件的視窗控制代碼 (HWND)。 這個範例會使用 WindowInteropHelper 類別。
// MainWindow.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
var wih = new System.Windows.Interop.WindowInteropHelper(this);
var hWnd = wih.Handle;
}
使用 C# 的 WinForms
下列 C# 程式碼顯示如何擷取 WinForms 表單物件的視窗控制代碼 (HWND)。 這個範例使用 NativeWindow.Handle 屬性。
// Form1.cs
private void button1_Click(object sender, EventArgs e)
{
var hWnd = this.Handle;
}
判斷裝載可視化元素的視窗
您可以從視覺元素存取 UIElement.XamlRoot;然後存取 XamlRoot.ContentIslandEnvironment;然後 ContentIslandEnvironment.AppWindowId 屬性包含最上層 Win32 HWND 的識別符。