Tôi có một nơi nào đó trong mã của tôi một hàm vòng lặp gọi là PeekMessage
để truy xuất sự kiện.Cách sử dụng PeekMessage để truy xuất mọi tin nhắn ngoại trừ đầu vào (chuột + bàn phím)
Hiện nay nó trông như thế này:
while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
{
// Process events
}
Bây giờ tôi muốn quản lý đầu vào ở một vị trí khác nhau, có nghĩa là tôi muốn lấy các thông điệp như WM_KEYDOWN
, WM_MOUSEMOVE
(chuột và bàn phím các sự kiện) trong một nơi khác, tại một thời điểm khác nhau của vòng lặp chính của tôi.
PeekMessage
's đối số thứ ba và thứ tư cho phép để xác định một loạt các thông điệp tới trở lại, vì vậy tôi có thể sử dụng này, sử dụng các macro cung cấp WM_KEYFIRST
, WM_KEYLAST
, WM_MOUSEFIRST
và WM_MOUSELAST
. Nhưng nó không thuận tiện bởi vì tôi có hai phạm vi để kiểm tra đầu vào, và do đó ba phạm vi cho tất cả mọi thứ còn lại.
Thông số cuối cùng là cờ và tôi có thể vượt qua PM_REMOVE | PM_QS_INPUT
để nhập. Nhưng sau đó, những gì tôi nên vượt qua trong vòng lặp khác, nơi tôi muốn nhận được tất cả các tin nhắn khác? Không có macro PM_QS_EVERYTHING_EXCEPT_INPUT
...
Cách nào là cách thanh lịch nhất để thực hiện việc này?
Cờ cuối cùng, không tồn tại của bạn có thể được hiển thị dưới dạng '~ PM_QS_INPUT', có thể được kết hợp với' PM_REMOVE' qua bitwise OR. – chris
Vâng, đó có thể là một giải pháp. Nhưng nó không làm tôi hài lòng bởi vì lá cờ này có hai loại sementics khác nhau: 1) loại tin nhắn cần lấy (PM_QS_ *), và 2) phải làm gì với thông điệp (PM_REMOVE, PM_NOREMOVE, nhưng cũng PM_NOYIELD mà tôi không muốn đặt và có khả năng bất kỳ cờ mới nào trên phiên bản Windows tiếp theo). Tôi đã không tìm thấy bất kỳ macro để tách hai sementics, mặc dù nhìn vào các giá trị thực tế, 16 bit đầu tiên được dành riêng cho thứ hai. – Benlitz
Lỗi của tôi, bạn nên sử dụng '~ PM_QS_INPUT', nhưng chỉ che giấu phạm vi các bit áp dụng cho các cờ thuộc loại đó. Đã có một bộ não thất bại ở đó. Vì vậy, nếu nửa cuối là cho rằng, nửa đầu sẽ là 0, và tất cả nhưng 'PM_QS_INPUT' trong nửa cuối cùng sẽ là 1. – chris