2009-11-29 28 views
9

Có cách nào để xác định và gửi các loại tin nhắn tùy chỉnh trong Win32, để được xử lý bởi trình xử lý tin nhắn chính của bạn không? Ví dụ, trình xử lý tin nhắn chính của tôi nắm bắt các tin nhắn như WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN vv Tôi có thể tạo WM_DOSOMETHING của riêng mình không? Nếu có, tôi sẽ gửi tin nhắn này như thế nào?Tạo các loại tin nhắn tùy chỉnh trong win32?

Ah, tôi thực sự chỉ phát hiện ra điều này đã được hỏi trước here, tuy nhiên, nó không trả lời như thế nào tôi thực sự sẽ gửi tin nhắn này.

Trả lời

13

Có. Chỉ cần khai báo một hằng số trong phạm vi WM_USER, ví dụ:

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001) 

Bạn cũng có thể đăng ký thư theo tên bằng cách sử dụng API RegisterWindowMessage.

Sau đó, bạn có thể gửi các tin nhắn này bằng SendMessage, PostMessage hoặc bất kỳ biến thể nào của chúng.

+0

cảm ơn! Là cần thiết để RegisterWindowMessage() nếu tin nhắn đang được gửi và bị bắt trong một ứng dụng duy nhất? – BeeBand

+3

Nếu sử dụng #define, hãy nhớ sử dụng dấu ngoặc đơn (WM_USER + 0x0001) để số học được thực hiện trên số thư mới của bạn (thao tác bit, đóng gói thành từ thứ tự cao, v.v.) hoạt động chính xác. – Travis

+1

Và không, bạn không cần RegisterWindowMessage nếu chỉ có một ứng dụng liên quan; chỉ khi bạn cần hai ứng dụng để đồng ý về một số tin nhắn duy nhất. – Travis

13

Woah, chúng ta hãy chỉ dừng lại và suy nghĩ ở đây ...

Trước hết, bản thân Windows gửi tin nhắn trong khoảng WM_USER+n, đó là lý do tại sao WM_APP được phát minh (Tôi thấy điều này ra cách cứng). Nhưng nó trở nên tồi tệ hơn ... không có gì để ngăn chặn các ứng dụng bị cư xử xấu phát sóngWM_USER+n hoặc WM_APP+n tin nhắn.

Vì vậy, lặp lại sau tôi, thông điệp an toàn duy nhất là thông điệp tôi tự định nghĩa và chỉ có thể thấy bản thân mình. Sử dụng RegisterWindowMessage. Và thậm chí sau đó, là không đáng tin cậy. Khi tôi cần một chuỗi để xác định RegisterWindowMessage, tôi sử dụng GUIDGEN để tạo chuỗi và đặt tiền tố ứng dụng cụ thể có thể đọc được trên gobbledygook để giúp tôi phân biệt nhiều thư trong mã.

Đặt cược vào sự ngu xuẩn của những người bạn đồng hành của bạn - đó luôn là cược thắng.

Nếu bạn muốn có nền tảng có thẩm quyền về toàn bộ chủ đề này, hãy xem here. Không, đó không phải trang web của tôi, đó là Joe Newcomer.

+0

"bởi vì con người đã đánh cắp tinh thể ngu ngốc vô hạn từ các vị thần" Con người ngu ngốc tốt hơn các vị thần ngu ngốc, mặc dù;) – Ben

1
  • Nếu bạn đã tạo cửa sổ lớp, bạn có thể sử dụng WM_USER phạm vi (hoặc WM_APP)
  • Nếu nó không phải là lớp học của bạn, bạn có thể sử dụng WM_APP
  • Nếu bạn muốn quảng bá các thông điệp tới mọi cửa sổ cấp cao nhất, đăng ký thông điệp toàn cầu của riêng bạn với RegisterWindowMessage
Các vấn đề liên quan