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

Recupera o identificador de janela (HWND) da janela representada pelo objeto que implementa IWindowNative.

Para obter mais informações e exemplos de código, consulte Recuperar um identificador de janela (HWND).

Sintaxe

HRESULT get_WindowHandle(
  HWND *hWnd
);

Parâmetros

hWnd

O identificador de janela (HWND).

Retornar valor

Se o método for bem-sucedido, ele retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

Exemplos

Antes de seguir este exemplo, examine estes tópicos:

Ícone personalizado de janela

Neste exemplo, mostramos como recuperar o identificador de janela (HWND) de nossa janela main e usá-lo para personalizar a barra de título da janela e seu conteúdo.

Criar um novo projeto

  1. No Visual Studio, crie um novo projeto C# ou C++/WinRT do modelo de projeto Aplicativo em Branco, Empacotado (WinUI 3 na Área de Trabalho).

MainWindow.xaml

Observação

Se você precisar de um arquivo de ícone para usar com este passo a passo, poderá baixar o computer.ico arquivo do aplicativo de exemplo WirelessHostednetwork . Coloque esse arquivo em sua Assets pasta e adicione o arquivo ao projeto como conteúdo. Em seguida, você poderá consultar o arquivo usando a URL Assets/computer.ico.

Caso contrário, fique à vontade para usar um arquivo de ícone que você já tem e altere as duas referências a ele nas listagens de código abaixo.

  1. Na listagem de código abaixo, você verá que, em MainWindow.xaml , adicionamos dois botões e especificamos manipuladores de clique para cada um. No manipulador Clique do primeiro botão (basicButton_Click), definimos o ícone e o texto da barra de título. No segundo (customButton_Click), demonstramos uma personalização mais significativa substituindo a barra de título pelo conteúdo do StackPanel chamado 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. Na listagem de código abaixo para o manipulador de basicButton_Click , para manter a barra de título personalizada oculta, recolhemos o customTitleBarPanelStackPanel e definimos a propriedade ExtendsContentIntoTitleBar como false.
  2. Em seguida, chamamos IWindowNative::get_WindowHandle (para C#, usando o método auxiliar de interoperabilidade GetWindowHandle) para recuperar o identificador de janela (HWND) da janela main.
  3. Em seguida, definimos o ícone do aplicativo (para C#, usando o pacote NuGet PInvoke.User32 ) chamando as funções LoadImage e SendMessage .
  4. Por fim, chamamos SetWindowText para atualizar a cadeia de caracteres da 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. No manipulador customButton_Click , definimos a visibilidade do customTitleBarPanelStackPanel como Visible.
  2. Em seguida, definimos a propriedade ExtendsContentIntoTitleBar como truee chamamos SetTitleBar para exibir o customTitleBarPanelStackPanel como nossa barra de título personalizada.
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 No arquivo, imediatamente após o <!-- Other app resources here --> comentário, adicionamos alguns pincéis de cor personalizada para a barra de título, conforme mostrado abaixo.
<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 você estiver acompanhando essas etapas em seu próprio aplicativo, poderá compilar seu projeto agora e executar o aplicativo. Você verá uma janela do aplicativo semelhante à seguinte (com o ícone de aplicativo personalizado):

    Aplicativo de modelo sem personalização.
    Aplicativo de modelo.

  • Esta é a barra de título personalizada básica:

    Aplicativo de modelo com ícone de aplicativo personalizado.
    Aplicativo de modelo com ícone de aplicativo personalizado.

  • Esta é a barra de título totalmente personalizada:

    Aplicativo de modelo com barra de título personalizada.
    Aplicativo de modelo com barra de título personalizada.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 10, versão 1809 (com SDK do Aplicativo Windows 0,5 ou posterior)
Cabeçalho microsoft.ui.xaml.window.h

Confira também