2012-02-17 11 views
5

Estoy utilizando ganchos globales de user32.dll con dllimport en C#. El teclado uno funciona bien, pero los eventos de la rueda del mouse son un problema. Esta es mi ratón de devolución de llamada de eventos:recuperar WHEEL_DELTA de wParam en WM_MOUSEHWHEEL msg en 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); 
     } 

todo va bien hasta que tenga que recuperar el valor WHEEL_DELTA que muestra qué manera y hasta qué punto la rueda se desplaza. Puesto que C# carece de la GET_WHEEL_DELTA_WPARAM macro, estoy usando el código que debe hacer el trabajo:

privado static int GetWheelDeltaWParam (int wparam) {return (int) (wparam >> 16); }

Pero la salida siempre es 0, lo que no tiene ningún sentido.

EDITAR - resultado:

 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

Algo parece estar mal. ¿Comparas 'wParam' para ** equality ** con el id del mensaje, pero luego quieres que varíen los 16 mejores del mismo valor? – AakashM

+0

Algo probablemente está mal, pero en ese caso, ¿cuál sería la solución correcta? – user1151923

Respuesta

4

El problema es que es GET_WHEEL_DELTA_WPARAM para extraer el delta rueda del ratón de la wParam de un WindowProc, mientras que lo que tienes es una devolución de llamadaLowLevelMouseProc. En your case,

wParam [en]

Tipo: WPARAM

El identificador del mensaje de ratón. Este parámetro puede ser uno de los siguientes mensajes: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN o WM_RBUTTONUP.

wParam es simplemente WM_MOUSEWHEEL; para obtener el delta rueda, que hay que buscar en

IParam [en]

Tipo: LPARAM

Un puntero a una estructura MSLLHOOKSTRUCT.

y dentro de esa estructura,

mouseData

Tipo: DWORD

Si el mensaje es WM_MOUSEWHEEL, la palabra de orden de este miembro es el delta rueda. La palabra de orden inferior está reservada. Un valor positivo indica que la rueda se giró hacia adelante, lejos del usuario ; un valor negativo indica que la rueda se giró hacia atrás, hacia el usuario. Un clic de rueda se define como WHEEL_DELTA, que es 120.

encontrará su valor.

favor, no me pregunte por la necesaria C# P/Invoke detalles para trabajar de esta estructura, ya que es casi seguro que conseguir que mal :)

0

Aquí busca WM_MOUSE**H**WHEEL, que es el movimiento horizontal de la rueda (lado a lado),

NO la acción de desplazamiento de la rueda, que es WM_MOUSEWHEE L.

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

¿Estás seguro de que eso es lo que quieres? Tal vez solo sustituya WM_MOUSEWHEEL aquí, y otras sugerencias.

Cuestiones relacionadas