2014-03-03 75 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