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
- 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.
- 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
- 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
. - 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.
- Em seguida, definimos o ícone do aplicativo (para C#, usando o pacote NuGet PInvoke.User32 ) chamando as funções LoadImage e SendMessage .
- 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");
}
- No manipulador customButton_Click , definimos a visibilidade do customTitleBarPanelStackPanel como Visible.
- Em seguida, definimos a propriedade ExtendsContentIntoTitleBar como
true
e 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
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>
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.
Esta é a barra de título personalizada básica:
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.
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 |