2012-02-17 22 views
5

Sto utilizzando hook globali da user32.dll con dllimport in C#. La tastiera funziona bene, ma gli eventi della rotellina del mouse sono un problema. Questo è il mio mouse callback dell'evento:recupera WHEEL_DELTA da wParam in WM_MOUSEHWHEEL msg in C#

 private IntPtr MouseInputCallback(
      int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      if (nCode < 0) return CallNextHookEx(mouseHookId, nCode, wParam, lParam); 

      int eventType = wParam.ToInt32(); 
      if (eventType == WM_MOUSEHWHEEL) 
      { 
       int wheelMovement = GetWheelDeltaWParam(eventType); 
      } 

      return CallNextHookEx(mouseHookId, nCode, wParam, lParam); 
     } 

tutto va bene fino a quando devo recuperare il valore WHEEL_DELTA che mostra in che modo e quanto la ruota è stato fatto scorrere. Dal momento che C# manca il GET_WHEEL_DELTA_WPARAM macro, sto usando questo codice che dovrebbe fare il lavoro:

private static int GetWheelDeltaWParam (int wParam) {return (int) (wParam >> 16); }

Ma l'uscita è sempre 0, che non ha alcun senso.

EDIT - risultato:

 MSLLHOOKSTRUCT mouseData = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); 
     int wheelMovement = GetWheelDeltaWParam(mouseData.mouseData); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct MSLLHOOKSTRUCT 
     { 
      public Point pt; 
      public int mouseData; 
      public int flags; 
      public int time; 
      public long dwExtraInfo; 
     } 
+0

Qualcosa sembra sbagliato. Confrontate 'wParam' per ** l'uguaglianza ** con l'id del messaggio, ma poi volete che i 16 bit principali dello stesso valore siano diversi? – AakashM

+0

Qualcosa probabilmente non funziona, ma in tal caso quale sarebbe la soluzione corretta? – user1151923

risposta

4

Il problema è che è GET_WHEEL_DELTA_WPARAM per estrarre il delta rotellina del mouse dal wParam di un WindowProc, mentre quello che hai è un callbackLowLevelMouseProc. In your case,

wParam [in]

Tipo: WPARAM

L'identificatore del messaggio del mouse. Questo parametro può essere uno dei seguenti messaggi: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN o WM_RBUTTONUP.

il wParam è semplicemente WM_MOUSEWHEEL; per ottenere il delta ruota, è necessario guardare in

lParam [in]

Tipo: LPARAM

Un puntatore a una struttura di MSLLHOOKSTRUCT.

e all'interno di tale struct,

mouseData

Tipo: DWORD

Se il messaggio è WM_MOUSEWHEEL, la parola di ordine di questo utente è il delta ruota. La parola di ordine inferiore è riservata. Un valore positivo indica che la ruota è stata ruotata in avanti, lontano dall'utente ; un valore negativo indica che la ruota è stata ruotata all'indietro, verso l'utente. La ruota con un clic è definita come WHEEL_DELTA, che è 120.

troverai il tuo valore.

Per favore non mi chiedere la necessaria C# P/Invoke dettagli per lavorare questo struct come avrei quasi sicuramente farli male :)

0

Qui siete alla ricerca di WM_MOUSE**H**WHEEL, che è il movimento orizzontale della ruota (lato a lato),

NON l'azione di scorrimento della ruota, che è WM_MOUSEWHEE L.

 if (eventType == WM_MOUSE**H**WHEEL) 
     { 
      int wheelMovement = GetWheelDeltaWParam(eventType); 
     } 

Sei sicuro che sia quello che vuoi? Forse basta sostituire lo WM_MOUSEWHEEL qui, così come altri suggerimenti.