1

我有一个小问题。我试着看谷歌,但它什么也没给我。我做了一个小程序,它使用全局钩子并在点击时获取鼠标坐标。问题是当我使用第二种方法时MouseDown,当我单击一个按钮时,MouseDown方法也会运行。

所以问题是:如何拆分两个方法并让它们单独工作:当我点击时,只有MouseClick方法被触发,当按下并按住一段时间时它只触发MouseDown

我应该使用一些时间还是什么?给我一个提示,我应该尝试使用什么。

PS对不起,我的英语不好,这不是我的母语。

这是一些代码,我认为可以提供概述。

public void StartRecording()
{
    mouseListener = new MouseHookListener(new GlobalHooker());           

    mouseListener.Start();
    mouseListener.MouseClick += new MouseEventHandler(MouseClicked);
    mouseListener.MouseDown += new MouseEventHandler(MouseDown);                
}

public void MouseClicked(object sender, MouseEventArgs e)
{
    MessageBox.Show(String.Format("Mouse was pressed at  {0}, {1}",
                                  Control.MousePosition.X.ToString(),
                                  Control.MousePosition.Y.ToString()));
}

public void MouseDown(object sender, MouseEventArgs e)
{
    MessageBox.Show(String.Format("Mouse was down at  {0}, {1}",
                                  Control.MousePosition.X.ToString(),
                                  Control.MousePosition.Y.ToString()));
}
4

3 回答 3

1

当您单击鼠标时,两者都是这种情况。据我所知,MouseClick 是 MouseDown 和 MouseUp,当您按下鼠标时,MouseDown 将被触发。当您释放按钮时,MouseUp 将被触发..

我认为您必须向 MouseDown 方法添加一些功能,该方法计算鼠标按下的时间。这将是我的解决方案。

于 2014-06-30T12:00:13.180 回答
1

如果MouseDown您应该将当前时间和坐标存储在它们所在类的全局变量中。

然后,您应该使用该MouseUp事件来检测鼠标按钮何时被释放。然后,您可以将新时间和坐标与存储的时间和坐标进行比较,以查看按钮按下了多长时间以及鼠标是否在该时间移动,并据此采取行动。

或者,如果需要,您也可以使用该MouseMove事件来重置时间和坐标。

于 2014-06-30T12:01:41.570 回答
1

作为一种解决方法,请MouseClick尝试使用MouseUp.

然后MouseDown将当前时间保存在类级别变量中(clickTime在示例中)。MouseUp再次检查时间。如果时间跨度更长,则说 3 秒 - 按下鼠标时执行您想要执行的操作,否则 - 继续单击鼠标。

    DateTime clickTime;
    public void MouseUp(object sender, MouseEventArgs e)
    {
        if (DateTime.Now - clickTime > someDelayTime)
        {
            // Do mouse down 
        }
        else
        {
            // Do mouse click
        }
    }

    public void MouseDown(object sender, MouseEventArgs e)
    {
        clickTime = DateTime.Now;
    }
于 2014-06-30T12:10:49.473 回答