Tôi đang cố gắng nắm bắt đầu vào bàn phím và chuột toàn cầu.Tìm hiểu về móc chuột và bàn phím mức thấp (win32)
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
if (wParam == WM_RBUTTONDOWN) printf("right mouse down\n");
if (wParam == WM_RBUTTONUP) printf("right mouse up\n");
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
while(true) {
MSG msg;
if (PeekMessage(&msg,0,0,0,PM_REMOVE)) {
printf("msg recvd\n");
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifdef TEST
Sleep(50);
#endif
}
Vì vậy, tất cả mọi thứ làm việc ở đây, ngoại trừ nếu tôi #define TEST
để đưa vào các Sleep
, chuột trở nên vô cùng chậm chạp, như thể được dự kiến nếu tôi đột nhiên chỉ cho phép chuột để cập nhật 20 lần một giây. Và không có giấc ngủ, tôi đang chốt CPU ở mức 100%. Nhưng đó là okay cho bây giờ (mà đi xa nếu tôi sử dụng GetMessage
). Bây giờ khi tôi hiểu nó, các móc mức thấp hoạt động bằng cách chuyển ngữ cảnh sang tiến trình đã cài đặt nó, và sau đó gửi quá trình một số loại thông điệp để cho phép nó thực hiện cuộc gọi móc. Điều gì làm tôi bối rối một chút, mặc dù, là lý do tại sao chương trình của tôi sẽ không bao giờ in "msg recvd", nhưng nó in "phải chuột xuống/lên" bất cứ khi nào tôi nhấp vào nút chuột phải. Điều này dẫn tôi đến kết luận rằng số MouseHookProc
của tôi đang được gọi trong cuộc gọi PeekMessage
. Nó chỉ xảy ra là một số loại tin nhắn đặc biệt và PeekMessage
trả về 0. Nhưng tôi vẫn cần phải gọi PeekMessage
hoặc một số tương đương.
Vì chương trình của tôi cần thực hiện nhiều thứ, tôi rõ ràng không thể cân nhắc vòng lặp truyền tin nhắn của tôi (gọi PeekMessage
) bằng cách gọi một chức năng khác, mất 50ms để quay lại. Làm thế nào tôi có thể đa luồng chương trình của tôi để duy trì sự đáp ứng của chuột trong khi đồng thời thực hiện một việc nâng hạng nặng? Trong một chương trình win32 đa luồng, vẫn chỉ có một hàng đợi tin nhắn, đúng không?
Cập nhật: Sau khi đọc lên tài liệu của MS, tôi nghĩ rằng tôi biết điều tôi cần làm là gì. Tôi chỉ nên sinh ra một chuỗi trong ứng dụng của tôi, gọi số SetWindowsHookEx
để đăng ký móc chuột, sau đó ngồi quanh vòng lặp tin nhắn riêng của nó và hệ thống sẽ xử lý việc gửi các bản cập nhật chuột cho chủ đề này. Nó sẽ được tự do làm bất cứ điều gì nó muốn trong các MouseHookProc
, và phần còn lại của ứng dụng của tôi sẽ chạy độc lập.
Bạn có 'MouseHookProc' bên trong một DLL và' SetWindowsHookEx' và 'PeekMessage' trong một EXE? – Oleg
Tôi muốn tránh phải tiêm một DLL. Nó có vẻ phù hợp hơn cho nhu cầu của tôi cho hệ thống để chuyển sang chương trình của tôi để gọi nó là 'MouseHookProc', do đó tại sao tôi muốn sử dụng móc chuột mức thấp. Theo tôi hiểu nó, một móc chuột thông thường, nếu tôi muốn nó là toàn cục, phải sử dụng phương thức DLL. –