Không có câu trả lời nào được cung cấp đã giúp tôi giải quyết vấn đề của mình, nhưng tôi đã tự tìm ra câu trả lời. Đây rồi.
Sử dụng SetWindowsHookEx()
với WH_KEYBOARD_LL
là phương pháp chính xác. Tuy nhiên, các thông số khác để SetWindowsHookEx()
là unintuitive:
- Tham số cuối cùng,
dwThreadId
, cần phải được 0.
- Tham số thứ hai cuối cùng,
hMod
, cần để trỏ đến một số DLL. Tôi đã sử dụng User32
, là một tệp DLL luôn được tải và được sử dụng bởi tất cả các quy trình bằng GUI. Tôi có ý tưởng này từ a CodeProject post about this.
Như vậy, mã trông một chút như thế này:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
Các tài liệu không rõ ràng về tham số thứ hai-ngoái. Nó nói:
Tham số hMod phải được đặt thành NULL [...] nếu thủ tục móc nằm trong mã được liên kết với quy trình hiện tại.
Không nói rằng điều này chỉ áp dụng cho một số loại móc, nhưng không áp dụng cho một số loại móc, nhưng không áp dụng cho WH_KEYBOARD_LL
và WH_MOUSE_LL
.
Vâng, đó là ý nghĩa của chúng - đối với chuột hoặc móc bàn phím cấp thấp (hoặc bất kỳ móc địa phương nào khác) hMod phải là IntPtr.Zero. –
Hmmm, bạn nói các bài viết khác không hữu ích sau đó tiến hành đăng câu trả lời tương tự mà nobugz đã cung cấp và đánh dấu bạn là câu trả lời chính xác. –
Nobugz không nói phải làm gì về hMod, và trái với bình luận đầu tiên của bạn, câu trả lời này cho thấy hMod được đặt thành cái gì đó ** khác ** hơn IntPtr.Zero. –