這個主題會教你如何在桌面應用程式中取得視窗的指柄。 範圍涵蓋
上述開發與使用者介面框架(幕後)都是基於 Win32 API 建構的。 在 Win32 中, 視窗 物件以一個稱為 視窗 handle 的值來識別。 窗戶把手的類型是 HWND (雖然在 C# 中會以 IntPtr 形式呈現)。 無論如何,你會聽到「HWND」這個詞被用作「視窗句柄」的簡稱。
在您的 WinUI、WPF 或 WinForms 桌面應用程式中,有幾個理由需要取得視窗的 HWND。 例如可以使用HWND來與某些依賴CoreWindow來顯示使用者介面 (UI) 的 Windows 執行階段 (WinRT) 物件進行互通。 更多資訊請參閱 顯示依賴 CoreWindow 的 WinRT UI 物件。
WinUI 搭配 C#
以下 C# 程式碼展示了如何取得 WinUI 視窗 物件的視窗代碼(HWND)。 此範例呼叫 WinRT.Interop.WindowNative C# interop 類別中的 GetWindowHandle 方法。 關於 C# 互通類別的更多資訊,請參見 從 .NET 應用程式呼叫互通 API。
// 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 搭配 C++
以下 C++/WinRT 程式碼展示了如何取得 WinUI 視窗 物件的視窗代柄(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 window.
auto windowNative{ this->m_inner.as<::IWindowNative>() };
HWND hWnd{ 0 };
windowNative->get_WindowHandle(&hWnd);
}
WPF 與 C#
以下 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;
}
WinForms 與 C#
以下 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 視窗處理序的 ID。