ウィンドウ ハンドルを取得する (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 を取得するには、いくつかの理由があります。 1 つの例として、HWND を使用して、CoreWindow に依存する特定の Windows Runtime (WinRT) オブジェクトと相互運用し、ユーザー インターフェイス (UI) を表示することが挙げられます。 詳細については、「CoreWindow に依存する WinRT UI オブジェクトを表示する」を参照してください。
C# を使用した WinUI 3
次の C# コードは、WinUI 3 Window オブジェクトのウィンドウ ハンドル (HWND) を取得する方法を示しています。 この例では、WinRT.Interop.WindowNative C# interop クラスで GetWindowHandle メソッドを呼び出します。 C# interop クラスの詳細については、「.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);
}
C# を使用した WPF
次の C# コードは、WPF window オブジェクトのウィンドウ ハンドル (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;
}
関連トピック
Windows developer