2017-10-15 5 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

반복적으로 코드를 실행하려면 루프 또는 타이머가 필요합니다. 확실히 타이머는 인간의 손가락에 의해 시작되고 중지되어야 할 때 루프가 반복 될 수있는 빈도를 감안할 때 찾고있는 것입니다. mousedown에서 타이머를 시작하고 마우스 업 알림에서 중지하십시오. 타이머는 일반적으로 ~ 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