Tôi đang sử dụng móc toàn cầu từ user32.dll với dllimport trong C#. Bàn phím một hoạt động tốt, nhưng các sự kiện bánh xe chuột là một vấn đề. Đây là lần gọi lại sự kiện chuột của tôi:truy xuất WHEEL_DELTA từ wParam trong WM_MOUSEHWHEEL msg trong 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);
}
Mọi thứ diễn ra tốt đẹp cho đến khi tôi lấy giá trị WHEEL_DELTA cho biết cách cuộn và bánh xe đã di chuyển như thế nào. Kể từ C# thiếu GET_WHEEL_DELTA_WPARAM vĩ mô, Tôi đang sử dụng mã này mà nên thực hiện công việc:
private static int GetWheelDeltaWParam (int wParam) {return (int) (wParam >> 16); }
Nhưng đầu ra luôn bằng 0, điều này không có ý nghĩa gì.
EDIT - Kết quả:
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;
}
Có điều gì đó không ổn. Bạn so sánh 'wParam' cho ** bình đẳng ** với id tin nhắn, nhưng sau đó muốn 16 bit trên cùng của giá trị thay đổi? – AakashM
Có thể có điều gì đó không ổn, nhưng trong trường hợp đó, giải pháp chính xác sẽ là gì? – user1151923