C# Windows窗体计算增量鼠标移动负值

C# Windows窗体计算增量鼠标移动负值,c#,winforms,mousemove,C#,Winforms,Mousemove,我正在尝试创建一个简单的应用程序,使用C#和.NET Framework 4.5通过网络发送鼠标输入,以远程控制另一台机器 当我试图在MouseMove事件中计算鼠标光标增量移动时,我遇到了一个奇怪的问题:下面是我为隔离此问题而编写的示例代码: public partial class Form1 : Form { private Point previousPosition; public Form1() { InitializeComponent()

我正在尝试创建一个简单的应用程序,使用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,但向右移动时它会按预期工作?

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

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

    if (mousePos == previousPosition)
        return;

    // .. your other code here        

    previousPosition = mousePos;
}

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

您的代码运行正常,只是更新速度太快了。如果您添加秒表并仅每隔500毫秒或每秒运行一次逻辑,则它将按预期工作。这是一个延迟的版本,所以你可以看到它的工作我不知道为什么它会这样做,我想出于某种原因,你会得到多个鼠标移动事件时,向左移动。。如果添加
If(mousePos==previousPosition)返回,则您将获得预期的行为。当您向负方向移动时,会引发太多移动事件,每移动1个像素,就有2个事件鼠标实际上没有移动。既有hor也有ver。奇怪的是,Windows版本肯定很重要。非常感谢!我现在很困惑,为什么向左移动时会多次调用MouseMove。很高兴提醒大家,有些事情发生得如此之快,以至于人眼无法看到:)一旦我完成网络基础设施,将动作发送给其他客户端,我将进一步测试检查是否真的有必要,并将结果发布在此处。