次の方法で共有


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

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

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 が含まれます。