Condividi tramite


Metodo IWindowNative::get_WindowHandle (microsoft.ui.xaml.window.h)

Recupera l'handle della finestra (HWND) della finestra rappresentata dall'oggetto che implementa IWindowNative.

Per altre informazioni ed esempi di codice, vedere Recuperare un handle di finestra (HWND).

Sintassi

HRESULT get_WindowHandle(
  HWND *hWnd
);

Parametri

hWnd

Handle finestra (HWND).

Valore restituito

Se questo metodo ha esito positivo, restituisce S_OK. In caso contrario, restituisce un codice di errore HRESULT .

Commenti

Esempi

Prima di seguire questo esempio, esaminare questi argomenti:

Icona della finestra personalizzata

In questo esempio viene illustrato come recuperare l'handle della finestra (HWND) della finestra principale e usarlo per personalizzare la barra del titolo della finestra e il relativo contenuto.

Creare un nuovo progetto

  1. In Visual Studio creare un nuovo progetto C# o C++/WinRT dal modello di progetto App vuota, Packaged (WinUI 3 in Desktop).

MainWindow.xaml

Nota

Se è necessario un file di icona da usare con questa procedura dettagliata, è possibile scaricare il computer.ico file dall'app di esempio WirelessHostednetwork . Inserire il file nella Assets cartella e aggiungere il file al progetto come contenuto. Sarà quindi possibile fare riferimento al file usando l'URL Assets/computer.ico.

In caso contrario, è possibile usare un file di icona già presente e modificare i due riferimenti nell'elenco di codice riportato di seguito.

  1. Nell'elenco di codice riportato di seguito si noterà che in MainWindow.xaml sono stati aggiunti due pulsanti e i gestori Click specificati per ognuno. Nel gestore Click per il primo pulsante (basicButton_Click), viene impostata l'icona della barra del titolo e il testo. Nel secondo (customButton_Click), viene illustrata una personalizzazione più significativa sostituendo la barra del titolo con il contenuto di StackPanel denominato customTitleBarPanel.
<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. Nell'elenco di codice riportato di seguito per il gestore basicButton_Click, per mantenere nascosta la barra del titolo personalizzata, comprimiamo la proprietà customTitleBarPanel StackPanel e viene impostata la proprietà ExtendsContentIntoTitleBar su false.
  2. Chiamiamo quindi IWindowNative::get_WindowHandle (per C#, usando il metodo helper di interoperabilità GetWindowHandle) per recuperare l'handle della finestra (HWND) della finestra principale.
  3. Verrà quindi impostata l'icona dell'applicazione (per C#, usando il pacchetto NuGet PInvoke.User32 ) chiamando le funzioni LoadImage e SendMessage .
  4. Infine, chiamiamo SetWindowText per aggiornare la stringa della barra del titolo.
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. Nel gestore customButton_Click viene impostata la visibilità dello stackPanelpersonalizzatoTitleBarPanel su Visible.
  2. Impostare quindi la proprietà ExtendsContentIntoTitleBar su truee chiamare SetTitleBar per visualizzare customTitleBarPanelStackPanel come barra del titolo personalizzata.
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 Nel file, subito dopo il <!-- Other app resources here --> commento, sono stati aggiunti alcuni pennelli colorati personalizzati per la barra del titolo, come illustrato di seguito.
<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. Se hai seguito questi passaggi nella tua app, puoi compilare il progetto ora ed eseguire l'app. Verrà visualizzata una finestra dell'applicazione simile alla seguente (con l'icona dell'app personalizzata):

    App modello senza personalizzazione.
    App modello.

  • Ecco la barra del titolo personalizzata di base:

    App modello con icona dell'applicazione personalizzata.
    App modello con icona dell'applicazione personalizzata.

  • Ecco la barra del titolo completamente personalizzata:

    App modello con barra del titolo personalizzata.
    App modello con barra del titolo personalizzata.

Requisiti

Requisito Valore
Client minimo supportato Windows 10, versione 1809 (con SDK per app di Windows 0,5 o versione successiva)
Intestazione microsoft.ui.xaml.window.h

Vedi anche