2012-05-09 34 views
5

Tôi đã phát triển một ứng dụng sử dụng móc khóa móc/chuột toàn cầu. Nó hoạt động hoàn hảo trong Windows 7, nhưng không hoạt động trong Windows XP.Lỗi khi sử dụng SetWindowsHookEx trong Windows XP, nhưng không phải trong Windows 7

Khi tôi gọi SetWindowsHookEx trong Windows XP, tôi nhận được mã lỗi 1428

int MouseLowLevel = 14 
int code = SetWindowsHookEx(MouseLowLevel, 
       MouseHookProc, 
       IntPtr.Zero, 
       0); 

private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {} 

Trả lời

11

Tò mò rằng mã này không thất bại trên Win7 nhưng tôi chắc chắn chưa bao giờ thử. Nhưng đó là hành vi đúng, có vẻ như họ đã cải thiện nó. Việc xác thực đối số cho SetWindowsHookEx() yêu cầu một đối số thứ 3 hoặc thứ 4 không hợp lệ. Mã lỗi có tính mô tả cao, từ WinError.h:

// 
// MessageId: ERROR_HOOK_NEEDS_HMOD 
// 
// MessageText: 
// 
// Cannot set nonlocal hook without a module handle. 
// 
#define ERROR_HOOK_NEEDS_HMOD   1428L 

Bất kỳ tay cầm mô-đun nào sẽ thực hiện vì nó không thực sự được sử dụng cho móc cấp thấp, không cần DLL để làm cho chúng hoạt động. Một số cẩn thận trong việc lựa chọn một là bắt buộc đối với .NET 4 vì CLR của nó không còn xử lý các mô đun cho các assembly được quản lý thuần túy nữa. Một trong những tốt nhất để sử dụng là một trong những bạn nhận được từ pinvoking LoadLibrary ("user32.dll") vì nó luôn luôn được nạp. Bạn không cần phải gọi FreeLibrary().

Bạn sẽ cần phải tuyên bố này để gọi LoadLibrary:

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)] 
private static extern IntPtr LoadLibrary(string fileName); 
+0

Cảm ơn bạn rất nhiều cho câu trả lời tuyệt vời. Bây giờ nó hoạt động trên cả Windows 7 và XP. – magol

+2

Bạn có một lỗi khác trong mã của bạn, kiểu trả về cho SetWindowsHookEx() là IntPtr, không phải int. –

+0

oops, tôi đã thực hiện một số lỗi khi tôi đơn giản hóa mã. Trong mã thực, tôi sử dụng một lớp kế thừa từ SafeHandleZeroOrMinusOneIsInvalid. Nhưng tôi không muốn quá nhiều chi tiết khi tôi đính kèm mã. Nhưng cảm ơn anyway :-) – magol

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