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;
}
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
Qualcosa probabilmente non funziona, ma in tal caso quale sarebbe la soluzione corretta? – user1151923