【问题标题】:Windows Forms calculating delta mouse movement negative valuesWindows 窗体计算增量鼠标移动负值
【发布时间】:2014-04-13 20:23:04
【问题描述】:

我正在尝试使用 C# 和 .NET Framework 4.5 创建一个简单的应用程序,通过网络发送鼠标输入来远程控制另一台机器

当我尝试在 MouseMove 事件中计算鼠标光标增量移动时遇到了一个奇怪的问题:下面是我为隔离此问题而制作的示例代码:

public partial class Form1 : Form
{
    private Point previousPosition;

    public Form1()
    {
        InitializeComponent();
        previousPosition = MousePosition;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        Point mousePos = MousePosition;
        int deltaX = (mousePos.X - previousPosition.X);
        int deltaY = (mousePos.Y - previousPosition.Y);


        label1.Text = "X: " + deltaX.ToString() + " Y: " + deltaY.ToString();
        label2.Text = "previousX: " + previousPosition.X + " currentX: " + mousePos.X;

        previousPosition = MousePosition;
    }
}

我将前一个光标位置存储在一个类变量中,并在 MouseMove 事件中计算位置差异并更新 previousPosition 变量。

现在奇怪的是,这仅适用于正增量(当我将鼠标向右移动时)。

我在表单中添加了一些标签以实时显示坐标,令我惊讶的是,当我向左移动光标时,前一个坐标和当前坐标始终保持不变,导致增量为零!

我在这里错过了什么愚蠢而明显的东西吗?为什么当我向左移动光标时,previousPosition 变量等于 MousePosition,但当我向右移动时它按预期工作?

【问题讨论】:

  • 您的代码运行良好,只是更新速度太快了。如果您添加一个秒表并仅每 500 毫秒或每秒运行一次逻辑,它就会按预期工作。这是一个延迟版本,所以你可以看到它可以工作pastebin.com/xnBKqbB6
  • 我不知道为什么会这样,我猜出于某种原因,你在向左移动时会收到多个鼠标移动事件。如果你添加if (mousePos == previousPosition) return;,那么你会得到预期的行为.
  • 当您向负方向移动时,会引发太多的移动事件,每移动 1 个像素,就会有 2 个事件鼠标实际上没有移动。 hor 和 ver。奇怪的怪癖,Windows 版本肯定很重要。

标签: c# winforms mousemove


【解决方案1】:

我复制了您的问题,并通过在代码中添加对重复移动事件的检查来修复它:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    Point mousePos = MousePosition;

    if (mousePos == previousPosition)
        return;

    // .. your other code here        

    previousPosition = mousePos;
}

我不知道为什么只有向左移动时,同一位置才会有多个鼠标移动事件。

【讨论】:

  • 非常感谢!我现在很困惑为什么向左移动时 MouseMove 会被多次调用。提醒一下,有些事情发生得如此之快,以至于人眼看不到:)
  • 一旦我完成网络基础设施以将动作发送给其他客户端,我将进一步测试是否确实需要检查并在此处发布结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多