所以我有一个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 :(得分: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;
}
答案 1 :(得分: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);