2010-06-13 7 views
8

MouseLeftButtonDown 이벤트는 발생하지 않지만 ContactDown 이벤트는 발생하지만 Microsoft Surface SDK를 사용하고 있기 때문에 프로그래밍 방식으로 WPF 컨트롤에서 MouseLeftButtonDown 이벤트를 수동으로 발생 시키려고합니다. 기본적으로 ContactDown 이벤트를 처리하는 동안 컨트롤에 올바른 동작을 발생시키기 위해 MouseLeftButtonDown 이벤트를 컨트롤로 푸시하려고합니다.프로그래밍 방식으로 MouseLeftButtonDown 이벤트 발생

저는 MouseButtonEventArgs를 사용하여 컨트롤에서 RaiseEvent 메서드를 사용해야한다고 생각합니다. 그러나 매개 변수를 알아 내는데 문제가 있습니다.

미리 도움 주셔서 감사합니다.

답변

5

Win32 interop을 사용하여 마우스 및 키 이벤트를 스푸핑 할 수 있습니다. MSDN/pinvoke.net에 SendInput 함수를 조사하십시오.

이렇게하면 시스템 및 다른 응용 프로그램이 마우스를 실제로 클릭 한 것으로 생각할 수 있습니다. WPF 이벤트를 시작하려는 경우 RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent))을 시도하십시오.

+0

팁 주셔서 감사. 게시 한 RaiseEvent 메서드에서 예외가 발생합니다. 'System.Windows.RoutedEventArgs'형식의 개체를 'System.Windows.Input.MouseButtonEventArgs'형식으로 변환 할 수 없습니다. – RajenK

+0

'RaiseEvent (새 MouseButtonEventArgs (Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left))); – devios1

+1

해당 장치에서 InvalidOperationException이 발생합니다. 모든 RoutedEventArgs에는 null이 아닌 RoutedEvent가 연결되어야합니다. – RajenK

2

컨트롤에서 특정 이벤트를 트리거하려는 것은 코드의 디자인 문제를 나타내는 지표가됩니다. 이벤트 처리기는 트리거 동작이어야하며 수행하지 마십시오.. MouseLeftButtonDown 이벤트 처리기에 의해 트리거 된 작업을 수행하는 코드를 별도의 메서드로 옮기는 것이 좋습니다. 그런 다음 동일한 메소드가 ContactDown 이벤트 핸들러에서 호출 될 수 있습니다.

+0

나는 이것이 최상의 솔루션이 될 것이라고 동의하지만이 특정 컨트롤 (바이너리 만)의 소스 코드에 액세스 할 수 없기 때문에 작동하지 않을까 걱정됩니다. – RajenK

2
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, 
    }; 

이것은 테스트 코드에서 이벤트를 시작하는 방법입니다.

관련 문제