2012-02-17 30 views
5

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; 
     } 
+0

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

+0

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

Trả lời

4

Vấn đề là GET_WHEEL_DELTA_WPARAM là để trích xuất vùng đồng bằng bánh xe chuột từ wParam của một WindowProc, trong khi những gì bạn có là một LowLevelMouseProc callback. Trong your case,

wParam [trong]

Loại: WPARAM

Từ định của thông điệp chuột. Tham số này có thể là một trong các thông báo sau: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN hoặc WM_RBUTTONUP.

wParam chỉ đơn giản là WM_MOUSEWHEEL; để có được những đồng bằng bánh xe, bạn cần phải xem xét trong

lParam [trong]

Loại: LPARAM

Một con trỏ đến một cấu trúc MSLLHOOKSTRUCT.

và trong struct đó,

mouseData

Type: DWORD

Nếu thông báo là WM_MOUSEWHEEL, từ bậc cao của thành viên này là vùng đồng bằng bánh xe. Từ thứ tự thấp được đặt trước. Giá trị dương cho biết bánh xe đã được quay về trước, cách xa người dùng ; một giá trị âm chỉ ra rằng bánh xe được xoay ngược, về phía người dùng. Nhấp chuột một bánh xe được định nghĩa là WHEEL_DELTA, là 120.

bạn sẽ tìm thấy giá trị của mình.

Xin đừng hỏi tôi cho cần thiết C# P/Gọi chi tiết để làm việc struct này như tôi gần như chắc chắn sẽ nhận được chúng sai :)

0

Ở đây bạn đang tìm kiếm WM_MOUSE**H**WHEEL, đó là phong trào theo chiều ngang của bánh xe (bên này sang bên kia),

KHÔNG hành động di chuyển của bánh xe, mà là WM_MOUSEWHEE L.

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

Bạn có chắc chắn đó là những gì bạn muốn? Có thể chỉ cần thay thế WM_MOUSEWHEEL tại đây, cũng như các đề xuất khác.

Các vấn đề liên quan