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

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

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;
}