2017-10-15 10 views
0

J'ai donc créé une touche de raccourci globale en utilisant SetWindowsHookEx(). Ce que je veux faire c'est que pendant que j'appuie sur le bouton droit de la souris, il devrait exécuter du code encore et encore. Le problème est que si j'appuie sur le bouton droit de la souris, il ne l'exécute qu'une seule fois.SetWindowsHookEx, exécutez le code lorsque le bouton de la souris est enfoncé

Ceci est ma fonction de rappel:

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

L'exécution répétée du code nécessite une boucle ou un temporisateur. Sûrement une minuterie est ce que vous recherchez étant donné la fréquence à laquelle une boucle peut se déclencher quand elle doit être démarrée et arrêtée par un doigt humain. Démarrez le minuteur sur le mousedown, arrêtez-le sur la notification de mouseup. La minuterie est généralement précise à ~ 16 millisecondes. –

Répondre

-1

Je ne peux pas juger exactement quelle est votre intention, mais suppose que vous devez combiner les WM_RBUTTONDOWN et WM_RBUTTONUP pour atteindre ce que vous voulez. Tout WM_RBUTTONDOWN, démarrez une boucle pour faire quelque chose, tandis que WM_RBUTTONUP, arrêtez de faire.

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

Ouais j'ai réussi à le résoudre avec une minuterie. Quand le bouton droit est en bas, j'ai démarré la minuterie, quand elle s'est levée, je l'ai arrêtée. – Celmos