Share via


Método IWindowNative::get_WindowHandle (microsoft.ui.xaml.window.h)

Recupera el identificador de ventana (HWND) de la ventana representada por el objeto que implementa IWindowNative.

Para obtener más información y ejemplos de código, vea Recuperar un identificador de ventana (HWND).

Sintaxis

HRESULT get_WindowHandle(
  HWND *hWnd
);

Parámetros

hWnd

Identificador de ventana (HWND).

Valor devuelto

Si este método se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.

Observaciones

Ejemplos

Antes de seguir este ejemplo, revise estos temas:

Icono de ventana personalizado

En este ejemplo, se muestra cómo recuperar el identificador de ventana (HWND) de la ventana principal y usarlo para personalizar la barra de título de la ventana y su contenido.

Creación de un proyecto

  1. En Visual Studio, cree un nuevo proyecto de C# o C++/WinRT a partir de la plantilla de proyecto Aplicación en blanco, empaquetada (WinUI 3 en escritorio).

MainWindow.xaml

Nota

Si necesita un archivo de icono para usarlo con este tutorial, puede descargar el computer.ico archivo de la aplicación de ejemplo WirelessHostednetwork . Coloque ese archivo en la Assets carpeta y agregue el archivo al proyecto como contenido. A continuación, podrá hacer referencia al archivo mediante la dirección URL Assets/computer.ico.

De lo contrario, no dude en usar un archivo de icono que ya tiene y cambie las dos referencias a él en las listas de código siguientes.

  1. En la lista de código siguiente, verá que en MainWindow.xaml hemos agregado dos botones y especificado Controladores de clic para cada uno. En el controlador Click del primer botón (basicButton_Click), establecemos el icono y el texto de la barra de título. En el segundo (customButton_Click), se muestra una personalización más significativa reemplazando la barra de título por el contenido de StackPanel denominado 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. En la lista de código siguiente para el controlador de basicButton_Click (para mantener oculta la barra de título personalizada), contraímos el elemento customTitleBarPanel StackPanel y establecemos la propiedad falseExtendsContentIntoTitleBar en .
  2. A continuación, llamamos a IWindowNative::get_WindowHandle (para C#, mediante el método auxiliar de interoperabilidad GetWindowHandle) para recuperar el identificador de ventana (HWND) de la ventana principal.
  3. A continuación, se establece el icono de aplicación (para C#, con el paquete NuGet PInvoke.User32 ) llamando a las funciones LoadImage y SendMessage .
  4. Por último, llamamos a SetWindowText para actualizar la cadena de la barra de título.
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. En el controlador de customButton_Click, establecemos la visibilidad de customTitleBarPanel StackPanel en Visible.
  2. A continuación, establecemos la propiedad ExtendsContentIntoTitleBar en y llamamos a SetTitleBar para mostrar customTitleBar StackPanel como nuestra barra de título personalizada.true
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. En el App.xaml archivo, inmediatamente después del <!-- Other app resources here --> comentario, hemos agregado algunos pinceles de color personalizado para la barra de título, como se muestra a continuación.
<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. Si ha estado siguiendo estos pasos en su propia aplicación, puede compilar el proyecto ahora y ejecutar la aplicación. Verá una ventana de aplicación similar a la siguiente (con el icono de aplicación personalizada):

    Aplicación de plantilla sin personalización.
    Aplicación de plantilla.

  • Esta es la barra de título personalizada básica:

    Aplicación de plantilla con icono de aplicación personalizado.
    Aplicación de plantilla con icono de aplicación personalizado.

  • Esta es la barra de título totalmente personalizada:

    Aplicación de plantilla con barra de título personalizada.
    Aplicación de plantilla con barra de título personalizada.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 10, versión 1809 (con SDK de Aplicaciones para Windows 0.5 o posterior)
Encabezado microsoft.ui.xaml.window.h

Consulte también