【问题标题】:SetWindowsHookEx, execute code while mouse button is pressedSetWindowsHookEx,按下鼠标按钮时执行代码
【发布时间】:2017-10-15 14:27:14
【问题描述】:

所以我使用SetWindowsHookEx() 创建了一个全局热键。我想要它做的是当我按下鼠标右键时它应该一次又一次地执行一些代码。问题是如果我按下鼠标右键,它只会执行一次。

这是我的回调函数:

private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {

        if (nCode >= 0)
        {
            if (wParam == (IntPtr)WM_RBUTTONDOWN)
            {
                _m.rtbLog.AppendText("Right mouse button was clicked \n");
            }

            else if (wParam == (IntPtr)WM_LBUTTONDOWN)
            {
                _m.rtbLog.AppendText("Left mouse button was clicked \n");
            }




        }

        return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
    }

【问题讨论】:

  • 重复运行代码需要循环或定时器。考虑到一个循环在需要由人的手指启动和停止时循环的频率,你肯定会寻找一个计时器。在 mousedown 上启动计时器,在 mouseup 通知上停止它。计时器通常精确到 ~16 毫秒。

标签: c# wpf button callback mouse


【解决方案1】:

我无法准确判断你的意图是什么,但猜想你需要结合WM_RBUTTONDOWNWM_RBUTTONUP 来实现你想要的。而WM_RBUTTONDOWN,开始循环做某事,而WM_RBUTTONUP,停止做。

private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{

    if (nCode >= 0)
    {
        if (wParam == (IntPtr)WM_RBUTTONDOWN)
        {
            Start();
        }

        else if (wParam == (IntPtr)WM_RBUTTONUP)
        {
            Stop();
        }
    }

    return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
}

private static void Satrt()
{
    _toStop = false;

    while (true)
    {
        if (_toStop)
        {
            _toStop = false;
            return;
        }

        DoTask();
    }
}

private static void Stop()
{
    _toStop = true;
}

private static void DoTask()
{
    // do something
}

private static bool _toStop;

【讨论】:

  • 是的,我设法用计时器解决了这个问题。当右键按下时我启动计时器,当它再次启动时我停止它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多