2014-03-03 77 views
2

所以我有一個捕獲圖像上的鼠標事件的WPF窗口。我對下面的代碼這樣做:C#WPF捕獲鍵盤和鼠標

<Image Name="imgPrimaryImage" Width="512" Height="512" RenderOptions.BitmapScalingMode="NearestNeighbor" Margin="5" 
     Source="{Binding Path=ImageMgr.ImageSource}" 
       MouseLeftButtonDown="OnMouseLeftButtonDown" 
       MouseMove="OnMouseMove" 
       MouseLeftButtonUp="OnMouseLeftButtonUp"/> 

應用程序的功能:當用戶移動鼠標左,右它,只要他們有鼠標左鍵按下改變圖像的大小。

問題:捕獲鼠標移動事件時,還可能捕獲鍵盤事件。

結果結果:我希望能夠根據CTRL和SHIFT按下來改變鼠標速度。我有我需要更改鼠標速度的代碼,我只是想知道如何獲取它,以便如果用戶在按住CTRL鍵的同時左鍵單擊並拖動圖像,它將更改速度。

如果有人對此有任何認識(即文章,文獻或建議),那將是非常好的。謝謝,如果有任何需要的額外信息,請讓我知道。

+0

也許這將幫助:http://stackoverflow.com/questions/5750722/how-to-detect-modifier-key-states-in-wpf – dkozl

+0

@dkozl做了詭計,你可以張貼這個作爲答案請。 – Jimmy

回答

2

,如果你想檢查鍵盤按鍵的狀態,你可以使用Keyboard類,它提供IsKeyDown方法

var isShift = Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift); 
var isCtrl = Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl); 
var isAlt = Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt); 

或使用總結評論其Modifiers財產

var isShift = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift); 
var isCtrl = Keyboard.Modifiers.HasFlag(ModifierKeys.Control); 
var isAlt = Keyboard.Modifiers.HasFlag(ModifierKeys.Alt); 
2

設置boolean標誌基於在按鍵事件中按下的鍵。

OnMouseMove記錄鼠標位置,如果爲null。否則,計算行進距離,並根據已設置的加速或減速標誌對其進行放大或減弱。

要抑制或放大,一旦X和Y從最後一點發生變化,乘以2或除以2 ...(您可以選擇自己的數字),現在將新的YX變化添加到當前鼠標XY座標並設置鼠標位置。

下面是MouseMove的樣子,以及一些需要的私有變量。在我的例子中,你必須包含Forms作爲參考。我沒有在我的Include語句中包含Forms,因爲它會在WPF應用程序中分解IntelliSense。你仍然需要保持這些_speedUp_slowDown變量與KeyDown事件

private bool entering = true; 
private Point _previousPoint; 
private bool _speedUp; 
private bool _slowDown; 
private double _speedMod = 2; 
private double _slowMod = .5; 

private void OnMouseMove(object sender, MouseEventArgs e) 
{ 
    Point curr = new Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y); 

    if (entering) 
    { 
     _previousPoint = curr; 
     entering = false; 
    } 
    if (_previousPoint == curr) 
     return; // The mouse hasn't really moved 

    Vector delta = curr - _previousPoint; 
    if (_slowDown && !_speedUp) 
     delta *= _slowMod; 
    else if (_speedUp && !_slowDown) 
     delta *= _speedMod; 
    else 
    { 
     _previousPoint = curr; 
     return; //no modifiers... lets not do anything 
    } 
    Point newPoint = _previousPoint + delta; 
    _previousPoint = newPoint; 
    //Set the point 
    System.Windows.Forms.Cursor.Position = new System.Drawing.Point((int)newPoint.X, (int)newPoint.Y); 
} 

編輯:我把按鍵事件在我的窗口定義,以及它工作得很好。雖然正如該主題的評論中指出的那樣,使用Keyboard.IsKeyDown要簡單得多。我還編輯上面以不引起奇怪的跳躍代碼發出

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    _slowDown = true; 
    if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl) 
     _slowDown = true; 
    else if (e.Key == Key.LeftShift || e.Key == Key.RightShift) 
     _speedUp = true; 
} 

private void Window_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl) 
     _slowDown = false; 
    else if (e.Key == Key.LeftShift || e.Key == Key.RightShift) 
     _speedUp = false; 
} 

private void Window_MouseLeave(object sender, MouseEventArgs e) 
{ 
    entering = true; 
} 
+0

感謝您的回覆。正如我所說,我有代碼來計算鼠標速度,並做出這些變化,這裏的未知是在鼠標移動事件中捕捉按鍵的能力。我試圖按照您的建議在按鍵上設置標誌值,但我遇到的問題是,只要左鍵單擊,似乎忽略任何鍵盤輸入。有什麼建議麼? – Jimmy

+0

@Jimmy經過實際測試,我發現它是沒有觸發的MouseEvents。我得到的KeyEvents很好。 – BenVlodgi

+0

與上面鏈接的dkozl我需要在鼠標事件本身內進行鍵綁定檢查。因此,這將是這個樣子: 私人無效的OnMouseMove(對象發件人,發送MouseEventArgs E) { 如果(Keyboard.IsKeyDown(Key.LeftCtrl)){ // 變化速度 }} – Jimmy