Freigeben über


IWindowNative::get_WindowHandle-Methode (microsoft.ui.xaml.window.h)

Ruft das Fensterhandle (Window Handle, HWND) des Fensters ab, das durch das Objekt dargestellt wird, das IWindowNative implementiert.

Weitere Informationen und Codebeispiele finden Sie unter Abrufen eines Fensterhandles (HWND).

Syntax

HRESULT get_WindowHandle(
  HWND *hWnd
);

Parameter

hWnd

Das Fensterhandle (HWND).

Rückgabewert

Wenn diese Methode erfolgreich ist, wird S_OK zurückgegeben. Andernfalls wird ein Fehlercode HRESULT zurückgegeben.

Bemerkungen

Beispiele

Bevor Sie diesem Beispiel folgen, lesen Sie die folgenden Themen:

Angepasstes Fenstersymbol

In diesem Beispiel wird gezeigt, wie Sie das Fensterhandle (HWND) unseres Standard Fensters abrufen und damit die Titelleiste und den Inhalt des Fensters anpassen.

Erstellen eines neuen Projekts

  1. Erstellen Sie in Visual Studio ein neues C#- oder C++/WinRT-Projekt aus der Projektvorlage Leere App, Verpackt (WinUI 3 in Desktop).

MainWindow.xaml

Hinweis

Wenn Sie eine Symboldatei für diese exemplarische Vorgehensweise benötigen, können Sie die Datei aus der computer.icoBeispiel-App WirelessHostednetwork herunterladen. Platzieren Sie diese Datei in Ihrem Assets Ordner, und fügen Sie die Datei ihrem Projekt als Inhalt hinzu. Anschließend können Sie mithilfe der URL Assets/computer.icoauf die Datei verweisen.

Andernfalls können Sie eine Symboldatei verwenden, die Sie bereits haben, und ändern Sie die beiden Verweise darauf in den folgenden Codelisten.

  1. In der folgenden Codeauflistung sehen Sie, dass wir in MainWindow.xaml zwei Schaltflächen hinzugefügt und jeweils Klickhandler angegeben haben. Im Klickhandler für die erste Schaltfläche (basicButton_Click) legen wir das Titelleistensymbol und den Text fest. Im zweiten (customButton_Click) wird eine größere Anpassung veranschaulicht, indem die Titelleiste durch den Inhalt des StackPanel namens customTitleBarPanel ersetzt wird.
<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. In der folgenden Codeliste für den basicButton_Click-Handlers reduzieren wir , um die benutzerdefinierte Titelleiste ausgeblendet zu halten, das customTitleBarPanelStackPanel, und wir legen die ExtendsContentIntoTitleBar-Eigenschaft auf fest false.
  2. Anschließend rufen wir IWindowNative::get_WindowHandle (für C# mit der Interop-Hilfsmethode GetWindowHandle) auf, um das Fensterhandle (Window Handle, HWND) des Standard-Fensters abzurufen.
  3. Als Nächstes legen wir das Anwendungssymbol (für C# mithilfe des NuGet-Pakets PInvoke.User32 ) fest, indem wir die Funktionen LoadImage und SendMessage aufrufen.
  4. Schließlich rufen wir SetWindowText auf, um die Titelleistenzeichenfolge zu aktualisieren.
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. Im customButton_Click-Handler legen wir die Sichtbarkeit von customTitleBarPanelStackPanel auf Visible fest.
  2. Anschließend legen wir die ExtendsContentIntoTitleBar-Eigenschaft auf truefest, und rufen SetTitleBar auf, um customTitleBarPanelStackPanel als benutzerdefinierte Titelleiste anzuzeigen.
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. In der App.xaml Datei haben wir unmittelbar nach dem <!-- Other app resources here --> Kommentar einige benutzerdefinierte Pinsel für die Titelleiste hinzugefügt, wie unten gezeigt.
<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. Wenn Sie diese Schritte in Ihrer eigenen App ausgeführt haben, können Sie ihr Projekt jetzt erstellen und die App ausführen. Es wird ein Anwendungsfenster ähnlich dem folgenden angezeigt (mit dem Symbol für die benutzerdefinierte App):

    Vorlagen-App ohne Anpassung.
    Vorlagen-App.

  • Dies ist die grundlegende benutzerdefinierte Titelleiste:

    Vorlagen-App mit benutzerdefiniertem Anwendungssymbol.
    Vorlagen-App mit benutzerdefiniertem Anwendungssymbol.

  • Dies ist die vollständig benutzerdefinierte Titelleiste:

    Vorlagen-App mit benutzerdefinierter Titelleiste.
    Vorlagen-App mit benutzerdefinierter Titelleiste.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10, Version 1809 (mit Windows App SDK 0.5 oder höher)
Kopfzeile microsoft.ui.xaml.window.h

Weitere Informationen