2012-05-13 22 views
7

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_MOUSEFIRSTWM_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?

+1

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

+0

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

+2

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

Trả lời

1

Bạn có thể thử sử dụng "Bộ lọc". Win32 gọi rằng "móc", hãy xem chức năng SetWindowsHookEx của msdn. bạn có khả năng cài đặt một bộ lọc cụ thể cho các thông điệp bàn phím và chuột. Sau đó, bạn có thể đẩy tin nhắn vào hàng đợi bảo trì của bạn và truy cập nó theo cách thủ công sau này (biết bạn có thể xóa các tin nhắn liên quan từ hàng đợi công cộng cho chuỗi đó nếu bạn chọn, từ móc, để chỉ có hàng đợi của người dùng của bạn mới có các thông điệp). mặc dù, bạn chỉ đơn giản có thể cũng trực tiếp đẩy vào hàng đợi sử dụng này trực tiếp từ công tắc PeekMessage trong mọi trường hợp mà bạn quan tâm.

Các vấn đề liên quan