C#WPF捕获键盘和鼠标

所以我有一个捕获图像上的鼠标事件的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键的同时左键单击并拖动图像,它将更改速度。

如果有人对此有所了解(即文章,文献或建议),那将是非常好的。 谢谢,如果有任何需要的额外信息,请让我知道。


总结评论如果你想检查键盘按键的状态,你可以使用提供IsKeyDown方法的Keyboard

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);

根据按键事件中按下的键来设置boolean标志。

OnMouseMove记录鼠标的位置,如果为null。 否则,计算行进距离,并根据已设置的加速或减速标志对其进行放大或减弱。

要抑制或放大,一旦X和Y从最后一点发生变化,乘以2或除以2 ...(您可以选择自己的数字),现在将新的YX变化添加到当前鼠标的XY坐标并设置鼠标位置。

这里是MouseMove外观,以及一些需要的私有变量。 在我的示例中,您必须将Forms作为参考。 我没有在我的Include语句中包含Forms,因为它会在WPF应用程序中分解IntelliSense。 您仍然需要使用KeyDown事件维护这些_speedUp_slowDown变量

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;
}
链接地址: http://www.djcxy.com/p/81007.html

上一篇: C# WPF Capture Keyboard and Mouse

下一篇: Fastest method for screen capturing on Linux