MouseHook,MouseDown和MouseClick拆分

时间:2014-06-30 11:50:01

标签: c# mouseclick-event mousedown mouse-hook

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

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

我应该使用某些时间或什么?请给我一个我应该尝试使用的提示。

P.S。对不起,我的英语不好,不是我的母语。

以下是一些代码,我认为是概述。

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

3 个答案:

答案 0 :(得分:1)

当您单击鼠标时两者都是如此。 MouseClick是我所知道的MouseDown和MouseUp,当你按下时会触发MouseDown。当您释放按钮时,MouseUp将被触发..

我认为你必须在MouseDown方法中添加一些功能来计算鼠标按下的时间。这将是我的解决方案。

答案 1 :(得分:1)

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

然后,您应该使用MouseUp事件来检测鼠标按钮的释放时间。然后,您可以将新时间和坐标与存储的时间进行比较,以查看按钮按下的时间以及鼠标是否在该时间内移动,并相应地对其进行操作。

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

答案 2 :(得分: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;
    }