Tôi đã cố gắng một số điều với lưỡi câu, và tôi không hiểu tại sao móc phải được sử dụng với một hàng đợi thông điệpTại sao phải SetWindowsHookEx được sử dụng với một hàng đợi thông điệp cửa sổ
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
Tại sao không làm điều gì đó như công việc này?
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
Sử dụng chủ đề tăng cường và rào cản không hoạt động. Tại sao không thể chờ đợi giữa móc và chưa được thực hiện theo cách khác?
EDIT:
tôi đã phạm sai lầm khi tôi tạo ra mẫu này, tôi tạo ra một cái móc WH_KEYBOARD_LL, không WH_KEYBOARD, (tôi không nghĩ rằng nó làm cho một sự khác biệt lớn)
Ngoài ra vòng lặp không bao giờ thực hiện chỉ đợi hàm GetMessage.
Vòng lặp chỉ thực hiện khi tôi đăng thông báo thoát PostThreadMessage(id, WM_QUIT, 2323, NULL);
vì vậy tôi không hiểu nó làm gì bên cạnh chờ đợi, có một số xử lý nội bộ không?
CÓ LIÊN QUAN:
C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup
How can I set up a CBT hook on a Win32 console window?
Vì vậy, nếu tôi hiểu điều này một cách chính xác, Windows chỉ có thể gọi lại cuộc gọi của tôi trong khi gọi Get/PeekMessage()? – Ha11owed
Bạn hiểu chính xác. Không có cách nào khác để tiêm một cách an toàn các cuộc gọi vào một chủ đề, nó phải được nhàn rỗi. Đây là lý do tại sao các vòng tin nhắn tồn tại. –
@HansPassant để làm rõ, bạn có gợi ý rằng cho móc toàn cầu như WH_KEYBOARD tên ống có thể được sử dụng để "vượt qua" thông tin trở lại chương trình của riêng tôi và chương trình đó không cần một máy bơm tin nhắn? – dave