本主题介绍如何获取桌面应用中的窗口句柄。 范围涵盖 WinUI 3, Windows Presentation Foundation (WPF) 和 Windows Forms (WinForms) 应用;代码示例显示在 C# 和 C++/WinRT 中。
上面列出的开发和 UI 框架是在 Win32 API 上构建的(幕后)。 在 Win32 中, 窗口 对象由称为 窗口句柄的值标识。 窗口句柄的类型是 HWND (尽管它以 C# 形式显示为 IntPtr)。 在任何情况下,您都会听到HWND作为窗口句柄的简写词。
在 WinUI、WPF 或 WinForms 桌面应用中检索窗口的 HWND 有多种原因。 一个示例是使用
使用 C# 开发的 WinUI
下面的 C# 代码演示如何检索 WinUI Window 对象的窗口 句柄(HWND)。 此示例在 WinRT.Interop.WindowNative C# 互作类上调用 GetWindowHandle 方法。 有关 C# 互作类的详细信息,请参阅 .NET 应用中的 Call 互作 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);
}
使用 C++ 的 WinUI
下面的 C++/WinRT 代码演示如何检索 WinUI Window 对象的窗口句柄(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);
}
使用 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 的 ID。