2017-10-15 101 views
0

所以我用SetWindowsHookEx()做了一个全局热键。我想要它做的是当我按下鼠标右键时,它应该一次又一次地执行一些代码。问题是,如果我按下鼠标右键,它只会执行一次。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); 
    } 
+0

重复运行代码需要一个循环或一个Timer。当然,计时器就是你正在寻找的东西,因为当一个循环需要被人的手指启动和停止时,循环多久可以循环。在mousedown上启动定时器,在mouseup通知中停止它。计时器通常精确到〜16毫秒。 –

回答

-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; 
+0

是的,我设法用定时器解决它。当右按钮关闭时,我启动了计时器,当它重新启动时,我停止了它。 – Celmos

相关问题