IWindowNative::get_WindowHandle メソッド (microsoft.ui.xaml.window.h)

IWindowNative を実装する オブジェクトによって表されるウィンドウのウィンドウ ハンドル (HWND) を取得します。

詳細とコード例については、「 ウィンドウ ハンドルの取得 (HWND)」を参照してください。

構文

HRESULT get_WindowHandle(
  HWND *hWnd
);

パラメーター

hWnd

ウィンドウ ハンドル (HWND)。

戻り値

このメソッドは、成功すると S_OK を返します。 そうでない場合は、HRESULT エラー コードを返します。

解説

この例に従う前に、次のトピックを確認してください。

カスタマイズされたウィンドウ アイコン

この例では、メイン ウィンドウのウィンドウ ハンドル (HWND) を取得し、これを使用してウィンドウのタイトル バーとその内容をカスタマイズする方法を示します。

新しいプロジェクトを作成する

  1. Visual Studio で、 空のアプリ、パッケージ (デスクトップの WinUI 3) プロジェクト テンプレートから新しい C# または C++/WinRT プロジェクトを作成します。

MainWindow.xaml

注意

このチュートリアルで使用するアイコン ファイルが必要な場合は、WirelessHostednetwork サンプル アプリからファイルをダウンロードcomputer.icoできます。 そのファイルを Assets フォルダーに配置し、そのファイルをコンテンツとしてプロジェクトに追加します。 その後、URL Assets/computer.icoを使用してファイルを参照できるようになります。

それ以外の場合は、既にあるアイコン ファイルを自由に使用し、次のコード一覧で 2 つの参照を変更してください。

  1. 次のコード一覧では、2 つのボタンが追加され、それぞれに Click ハンドラーが指定されていることがわかりますMainWindow.xaml。 最初のボタン (basicButton_Click) のクリック ハンドラーで、タイトル バーのアイコンとテキストを設定します。 2 つ目の (customButton_Click) では、タイトル バーを customTitleBarPanel という名前の StackPanel の内容に置き換えることで、より重要なカスタマイズを示します。
<Window
    x:Class="window_titlebar.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:window_titlebar"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid x:Name="rootElement" RowDefinitions="100, *, 100, *">

        <StackPanel x:Name="customTitleBarPanel" Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Top" Visibility="Collapsed">
            <Image Source="Images/windowIcon.gif" />
            <TextBlock VerticalAlignment="Center" Text="Full customization of title bar"/>
        </StackPanel>

        <StackPanel x:Name="buttonPanel"  Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
            <Button x:Name="basicButton" Click="basicButton_Click" Margin="25">Set the Window title and icon</Button>
            <Button x:Name="customButton" Click="customButton_Click" Margin="25">Customize the window title bar</Button>
        </StackPanel>

    </Grid>
</Window>

MainWindow.xaml.cs/cpp

  1. basicButton_Click ハンドラーの次のコード一覧では、カスタム タイトル バーを非表示にするため、customTitleBarPanelStackPanel を折りたたみ、ExtendsContentIntoTitleBar プロパティを にfalse設定しています。
  2. 次に、IWindowNative::get_WindowHandle (C# の場合は、相互運用ヘルパー メソッド GetWindowHandle を使用) を呼び出して、メイン ウィンドウのウィンドウ ハンドル (HWND) を取得します。
  3. 次に、LoadImage 関数と SendMessage 関数を呼び出して、アプリケーション アイコン (C# の場合は PInvoke.User32 NuGet パッケージを使用) を設定します。
  4. 最後に、 SetWindowText を呼び出してタイトル バーの文字列を更新します。
private void basicButton_Click(object sender, RoutedEventArgs e)
{
    // Ensure the custom title bar content is not displayed.
    customTitleBarPanel.Visibility = Visibility.Collapsed;

    // Disable custom title bar content.
    ExtendsContentIntoTitleBar = false;

    //Get the Window's HWND
    var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

    IntPtr hIcon = PInvoke.User32.LoadImage(
        IntPtr.Zero,
        "Images/windowIcon.ico",
        PInvoke.User32.ImageType.IMAGE_ICON,
        20, 20,
        PInvoke.User32.LoadImageFlags.LR_LOADFROMFILE);

    PInvoke.User32.SendMessage(
        hwnd,
        PInvoke.User32.WindowMessage.WM_SETICON,
        (IntPtr)0,
        hIcon);

    PInvoke.User32.SetWindowText(hwnd, "Basic customization of title bar");
}
// pch.h
...
#include <microsoft.ui.xaml.window.h>
...

// MainWindow.xaml.h
...
void basicButton_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& args);
...

// MainWindow.xaml.cpp
void MainWindow::basicButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    // Ensure the that custom title bar content is not displayed.
    customTitleBarPanel().Visibility(Visibility::Collapsed);

    // Disable custom title bar content.
    ExtendsContentIntoTitleBar(false);

    // Get the window's HWND
    auto windowNative{ this->m_inner.as<::IWindowNative>() };
    HWND hWnd{ 0 };
    windowNative->get_WindowHandle(&hWnd);

    HICON icon{ reinterpret_cast<HICON>(::LoadImage(nullptr, L"Assets/computer.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)) };
    ::SendMessage(hWnd, WM_SETICON, 0, (LPARAM)icon);

    this->Title(L"Basic customization of title bar");
}
  1. customButton_Click ハンドラーで、customTitleBarPanel StackPanel の可視性を Visible に設定します
  2. 次に 、ExtendsContentIntoTitleBar プロパティを に true設定し、 SetTitleBar を呼び出して customTitleBarPanelStackPanel をカスタム タイトル バーとして表示します。
private void customButton_Click(object sender, RoutedEventArgs e)
{
    customTitleBarPanel.Visibility = Visibility.Visible;

    // Enable custom title bar content.
    ExtendsContentIntoTitleBar = true;
    // Set the content of the custom title bar.
    SetTitleBar(customTitleBarPanel);
}
// MainWindow.xaml.h
...
void customButton_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& args);
...

// MainWindow.xaml.cpp
void MainWindow::customButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    customTitleBarPanel().Visibility(Visibility::Visible);

    // Enable custom title bar content.
    ExtendsContentIntoTitleBar(true);

    // Set the content of the custom title bar.
    SetTitleBar(customTitleBarPanel());
}

App.xaml

  1. App.xamlこのファイルでは、コメントの直後に<!-- Other app resources here -->、次に示すように、タイトル バーにカスタムカラーのブラシがいくつか追加されています。
<Application
    x:Class="window_titlebar.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:window_titlebar">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                <!-- Other merged dictionaries here -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Other app resources here -->
            <SolidColorBrush x:Key="WindowCaptionBackground">Green</SolidColorBrush>
            <SolidColorBrush x:Key="WindowCaptionBackgroundDisabled">LightGreen</SolidColorBrush>
            <SolidColorBrush x:Key="WindowCaptionForeground">Red</SolidColorBrush>
            <SolidColorBrush x:Key="WindowCaptionForegroundDisabled">Pink</SolidColorBrush>
        </ResourceDictionary>
    </Application.Resources>
</Application>
  1. 独自のアプリでこれらの手順に従っている場合は、今すぐプロジェクトをビルドし、アプリを実行できます。 次のようなアプリケーション ウィンドウが表示されます (カスタム アプリ アイコン)。

    カスタマイズのないテンプレート アプリ。
    テンプレート アプリ。

  • 基本的なカスタム タイトル バーを次に示します。

    カスタム アプリケーション アイコンを使用したテンプレート アプリ。
    カスタム アプリケーション アイコンを使用したテンプレート アプリ。

  • 完全にカスタムのタイトル バーを次に示します。

    カスタム タイトル バーを含むテンプレート アプリ。
    カスタム タイトル バーを含むテンプレート アプリ。

要件

要件
サポートされている最小のクライアント Windows 10 Version 1809 (Windows アプリ SDK 0.5 以降)
Header microsoft.ui.xaml.window.h

こちらもご覧ください