Quero ter uma janela do WinUI 3 sem barra de título e arrastável de toda a área do cliente.
Como eu costumava fazer no Winforms e no WPF, tentei usar uma chamada win32 (o "sendMeaasge") (veja o código abaixo). Mas parece estar quebrado no WinUI 3 porque não arrasta a janela no ponteiro pressionado, mas apenas quando o ponteiro é solto.
abaixo está o código usando a chamada da API win32 "sendMessage". Ao usar isso, a janela é movida somente quando o ponteiro é liberado.
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
//Remove the title bar
(AppWindow?.Presenter as OverlappedPresenter)?.SetBorderAndTitleBar(false, false);
Content = new Grid() { Background = new SolidColorBrush(Colors.Transparent) };
this.Content.PointerPressed += MainWindow_PointerPressed;
}
private void MainWindow_PointerPressed(object sender, PointerRoutedEventArgs e)
{
ReleaseCapture();
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
SendMessage(hwnd, WM_NCLBUTTONDOWN, (IntPtr)HTCAPTION, IntPtr.Zero);
}
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 0x2;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool ReleaseCapture();
}
Eu também tento usar o pointerPressed, pointerMoved e pointerReleased e mover a janela manualmente, mas não é suave o suficiente. Eu gostaria que o mouse e o toque funcionassem, então é por isso que não quero usar a posição do cursor para mover a janela.