Внедрить / симулировать события щелчка мыши с маршрутизацией WPF - PullRequest
3 голосов
/ 25 сентября 2011

У меня есть несколько простых элементов управления WPF 3.5, обрабатывающих щелчки левой кнопкой мыши, которые мне нужно использовать в приложении Surface (SDK 1.0).Проблема, с которой я сталкиваюсь, заключается в том, что по умолчанию они не работают.Я думаю об обертывании каждого элемента управления в SurfaceContentControl и переводе ContactTouchDown или ContactTapGesture событий в соответствующие MouseDown события.

Проблема сводится к тому, как «внедрить» или смоделировать произвольно маршрутизируемыймышиные события?Я пытался InputManager.Current.ProcessInput(), но не очень далеко.Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Идея evpo интересна (хотя, если вы работаете с пользовательскими элементами управления, они редко поставляются с классами AutomationPeer).

Вы не можете просто «ввести» ввод мыши, отправив события WM_MOUSE * в ваше приложение ... WPF действительно обработает сообщение, но когда он выяснит положение мыши для этого события, он запросит фактический API мыши вместо того, чтобы пытаться использовать то, что вы вставляете в WM.

Так что на самом деле все, что вы можете сделать, это сказать окнам, чтобы они перемещали курсор мыши и действовали так, как будто кнопка нажата / отпущена. Некоторый код, который вы можете использовать для этого, находится в http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

Тем не менее, хотя вы технически можете сделать это, это отстой ... у вас есть дорогое устройство с сенсорным мультитачем, но вы 1) показываете курсор мыши на нем 2) ограничивает произвольные части его использованием «одним касанием» (и только одна из этих произвольных частей за раз и 3) придумать произвольный метод определения того, какой палец вы будете рассматривать как управляющий мышью один

1 голос
/ 26 сентября 2011

Попробуйте использовать классы AutomationPeer. Например, ButtonAutomationPeer предназначен для кнопки. Код ниже инициирует клик.

ButtonAutomationPeer peer = new ButtonAutomationPeer(button);
IInvokeProvider provider = (IInvokeProvider)peer.GetPattern(PatternInterface.Invoke);
provider.Invoke();
...