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);
Nguồn
2012-05-09 12:56:03
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
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. –
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