2010-06-13 167 views
8

我試圖以編程方式手動觸發WPF控件上的MouseLeftButtonDown事件,因爲我使用Microsoft Surface SDK,它不會觸發MouseLeftButtonDown事件,而是觸發ContactDown事件。基本上我試圖將MouseLeftButtonDown事件向下推送到控件,以在處理ContactDown事件時觸發控件上的正確行爲。以編程方式觸發MouseLeftButtonDown事件

我猜我必須以某種方式使用控件上的RaiseEvent方法來做到這一點與MouseButtonEventArgs,但我有一些麻煩搞清楚參數。

在此先感謝您的幫助!

回答

5

您可以使用Win32 interop欺騙鼠標和鍵盤事件。調查MSDN/pinvoke.net上的SendInput函數。

請注意,這將導致系統和其他應用程序認爲鼠標實際上被點擊。如果您只想啓動WPF事件,請嘗試RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent))

+0

感謝您的提示。我收到您發佈的RaiseEvent方法的異常: 'System.Windows.RoutedEventArgs'類型的對象無法轉換爲類型'System.Windows.Input.MouseButtonEventArgs'。 – RajenK 2010-06-15 11:18:17

+0

嘗試'RaiseEvent(新的MouseButtonEventArgs(Mouse.PrimaryDevice,Environment.TickCount,MouseButton.Left));' – devios1 2010-06-15 12:08:23

+1

InvalidOperationException發生那個: 每個RoutedEventArgs必須有一個非空的RoutedEvent與它關聯。 – RajenK 2010-06-21 14:23:24

2

希望在控件中觸發某個事件常常是代碼中的設計問題的指示器。事件處理程序應該觸發行爲,而不是執行它。我建議您將執行由MouseLeftButtonDown事件處理程序觸發的操作的代碼移動到單獨的方法中。然後可以從ContactDown事件處理程序調用相同的方法。

+0

我同意這將是最好的解決方案,但由於我沒有訪問此特定控件的源代碼(只有二進制文件),恐怕這是行不通的。 – RajenK 2010-06-13 20:53:01

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

這是我在測試代碼中觸發事件的方式。

相關問題