Как захватить мышь для событий MouseMove во всем окне? - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно использовать пользовательский курсор для перетаскивания. Изначально я использовал Adorner, но теперь я хотел бы иметь возможность показывать его также при перемещении между окнами, или даже если есть одно окно, чтобы не вырезать курсор на полях окна, поэтому я пытаюсь использовать ответы здесь .

Пока я перемещаю курсор за пределы окна, которое является единственным окном в этом тестовом приложении, события MouseMove не генерируются. События MouseMove снова возникают, когда я перемещаю курсор в окне.

Я пытался это и это безуспешно. Я также прочитал официальную документацию .

XAML:

<Window x:Class="cs_wpf_test_9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:cs_wpf_test_9"
        mc:Ignorable="d"
        Title="MainWindow" Height="127" Width="269"
        Loaded="Window_Loaded"
        MouseMove="Window_MouseMove">
    <Label HorizontalAlignment="Center" VerticalAlignment="Center">Testing</Label>
</Window>

Код-за:

namespace cs_wpf_test_9
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public static Point GetMousePositionWindowsForms()
        {
            System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
            return new Point(point.X, point.Y);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Mouse.Capture(this);
        }

        internal void UpdateCursorPos()
        {
            Point p = GetMousePositionWindowsForms();
            // Tracepoint here to show {p}
        }

        private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            UpdateCursorPos();
        }
    }
}

Ожидается: на панели «Вывод» должны быть выходные данные обработчика события MouseMove для каждого движения мыши, в том числе когда мышь перемещалась за пределы окна.

Факт: обработчик события вызывается только тогда, когда мышь перемещается внутри окна.

Обновление: Если я установил для AllowDrop в окне значение true, а для MouseDown, я вызываю DoDragDrop, обработчик DragOver вызывается только тогда, когда курсор мыши находится над окном, хотя мышь принудительно захватывается с помощью метод CaptureMouse UIElement. Для меня было бы достаточно, чтобы событие DragOver работало так, как я объяснил выше, потому что то, что я хочу реализовать, - это лучшее перетаскивание. Я тоже пытался поставить:

Mouse.Capture(this, CaptureMode.Element);
CaptureMouse();

перед вызовом DoDragDrop, но происходит то же самое.

...