Программный запуск события MouseLeftButtonDown

Я пытаюсь вручную запустить событие MouseLeftButtonDown в элементе управления WPF программно, поскольку я использую Microsoft Surface SDK, который запускает не события MouseLeftButtonDown, а события ContactDown. В основном я пытаюсь подтолкнуть событие MouseLeftButtonDown к элементу управления, чтобы запустить правильное поведение элемента управления при обработке события ContactDown.

Я предполагаю, что мне нужно каким-то образом использовать метод RaiseEvent для элемента управления, чтобы сделать это с MouseButtonEventArgs, но у меня возникли проблемы с определением параметров.

Заранее спасибо за помощь!


person RajenK    schedule 13.06.2010    source источник


Ответы (4)


Вы можете подделать события мыши и клавиш, используя взаимодействие Win32. Изучите функцию SendInput на MSDN / pinvoke.net.

Обратите внимание, что это заставит систему и другие приложения думать, что мышь действительно была нажата. Если вы просто хотите инициировать событие WPF, попробуйте RaiseEvent( new RoutedEventArgs( UIElement.MouseLeftButtonDownEvent ) ).

person devios1    schedule 13.06.2010
comment
Спасибо за совет. Я получаю исключение с этим методом RaiseEvent, который вы опубликовали: объект типа «System.Windows.RoutedEventArgs» не может быть преобразован в тип «System.Windows.Input.MouseButtonEventArgs». - person RajenK; 15.06.2010
comment
Попробуйте RaiseEvent( new MouseButtonEventArgs( Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left ) ); - person devios1; 15.06.2010
comment
С этим возникает InvalidOperationException: с каждым RoutedEventArgs должно быть связано ненулевое RoutedEvent. - person RajenK; 21.06.2010
comment
Хорошо, это работает: startOpBtn.RaiseEvent( new MouseButtonEventArgs( Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left ) { RoutedEvent = Button.ClickEvent } ); однако он использует событие щелчка. UIElement.MouseLeftButtonDown и UIElement.MouseLeftButtonUp компилируются и запускаются, но они не нажимают кнопку, вероятно, потому, что курсор мыши действительно должен находиться над кнопкой, чтобы проверка попадания работала. - person devios1; 21.06.2010
comment
Спасибо chaiguy, думаю поищу альтернативное решение. - person RajenK; 11.07.2010
comment
Кто-нибудь нашел обходной способ поднять это событие? То, что сказал @ devios1, полезно, но все еще не запускает его. - person xandermonkey; 15.03.2017

Желание вызвать определенное событие в элементе управления довольно часто является индикатором проблемы дизайна в коде. Обработчики событий должны запускать поведение, а не выполнять его. Я бы посоветовал вам переместить код, выполняющий действие, запускаемое обработчиком событий MouseLeftButtonDown, в отдельный метод. Затем тот же метод можно вызвать из обработчика событий ContactDown.

person Fredrik Mörk    schedule 13.06.2010
comment
Я согласен, что это было бы лучшим решением, но, поскольку у меня нет доступа к исходному коду этого конкретного элемента управления (только двоичный файл), я боюсь, что это не сработает. - person RajenK; 14.06.2010

var grid = new Grid();            

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds;
const MouseButton mouseButton = MouseButton.Left;
var mouseDownEvent =
   new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) {
       RoutedEvent = UIElement.MouseLeftButtonDownEvent,
       Source = grid,
   };

Вот как я запускаю событие в своем тестовом коде.

person viktorg    schedule 15.12.2011

Это статический метод, который я использую для создания событий щелчка для любого UIElement.

using System;
using System.Windows;
using System.Windows.Input;

    
public static void RaiseMouseClickEvent(UIElement elementToClick, MouseButton buttonToUse)
{
    elementToClick.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, buttonToUse) { RoutedEvent = Button.ClickEvent });
}
person marsh-wiggle    schedule 27.11.2020