このトピックでは、デスクトップ アプリでウィンドウのウィンドウ ハンドルを取得する方法について説明します。 このスコープは、 WinUI 3、 Windows Presentation Foundation (WPF)、 および Windows フォーム (WinForms) アプリを 対象としています。コード例は、C# と C++/WinRT で示されています。
上記の開発フレームワークと UI フレームワークは、 Win32 API 上に構築された (バックグラウンドで) あります。 Win32 では、 ウィンドウ オブジェクトは ウィンドウ ハンドルと呼ばれる値によって識別されます。 また、ウィンドウ ハンドルの型は HWND です (ただし、C# では IntPtr として表示されます)。 いずれの場合も、ウィンドウ ハンドルの短縮形として使用される HWND という用語が読み上げられます。
WinUI 3、WPF、または WinForms デスクトップ アプリでウィンドウの HWND を取得するには、いくつかの理由があります。 1 つの例として、 HWND を使用して、 CoreWindow に依存する特定の Windows ランタイム (WinRT) オブジェクトと相互運用し、ユーザー インターフェイス (UI) を表示します。 詳細については、「 CoreWindow に依存する WinRT UI オブジェクトの表示」を参照してください。
WinUI 3 と C#
次の C# コードは、WinUI 3 Window オブジェクトのウィンドウ ハンドル (HWND) を取得する方法を示しています。 この例では、WinRT.Interop.WindowNative C# 相互運用クラスで 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 3 window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}
C++ での WinUI 3
次の C++/WinRT コードは、WinUI 3 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 3 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;
}
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 が含まれます。
関連トピック
Windows developer