ウィンドウ ハンドルを取得する (HWND)

このトピックでは、デスクトップ アプリでウィンドウのウィンドウ ハンドルを取得する方法について説明します。 このスコープには、WinUI 3Windows 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;
}