2009-11-29 11 views
9

Czy istnieje sposób definiowania i wysyłania niestandardowych typów wiadomości w systemie Win32, aby zostać przechwyconym przez główną procedurę obsługi wiadomości? Na przykład moja główna funkcja obsługi wiadomości przechwytuje komunikaty, takie jak WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN itd. Czy mogę utworzyć własne WM_DOSOMETHING? Jeśli tak, jak wyślę tę wiadomość?Tworzenie niestandardowych typów wiadomości w win32?

Ah, właśnie odkryłem, że zostało to zadane przed here, jednak nie odpowiada, w jaki sposób wysłałbym tę wiadomość.

Odpowiedz

13

Tak. Po prostu zadeklaruj stałą w zakresie WM_USER, np.

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001) 

Możesz również zarejestrować wiadomość według nazwy, korzystając z interfejsu API RegisterWindowMessage.

Następnie możesz wysłać te wiadomości za pomocą SendMessage, PostMessage lub dowolnego z ich wariantów.

+0

dzięki! Czy jest wymagana funkcja RegisterWindowMessage(), jeśli wiadomość jest wysyłana i przechwytywana tylko w ramach jednej aplikacji? – BeeBand

+3

Jeśli używasz #define, pamiętaj, aby użyć nawiasów wokół (WM_USER + 0x0001), więc arytmetyczna operacja na twoim nowym numerze wiadomości (operacje bitowe, pakowanie do słowa o wysokim priorytecie itd.) Działa poprawnie. – Travis

+1

I nie, nie potrzebujesz RegisterWindowMessage, jeśli jest zaangażowana tylko jedna aplikacja; tylko wtedy, gdy potrzebujesz dwóch aplikacji, aby uzgodnić jeden numer wiadomości. – Travis

13

Woah, po prostu zatrzymać i pomyśleć o ...

Przede wszystkim sam system Windows wysyła wiadomości w zakresie WM_USER+n, dlatego WM_APP wynaleziono (Znalazłem się na własnej skórze). Ale robi się coraz gorzej ... nie ma nic, co mogłoby powstrzymać źle zachowane aplikacje emitujące wiadomościWM_USER+n lub WM_APP+n, a ponieważ ludzie wykradli kryształ nieskończonej głupoty od Bogów, tak naprawdę dzieje się w prawdziwym świecie.

Tak, powtórz za mną, jedyną bezpieczną wiadomością jest ta, którą sam definiuję i mogę zobaczyć tylko siebie. Użyj RegisterWindowMessage. I nawet wtedy nie ufajcie. Kiedy potrzebuję łańcucha znaków do zdefiniowania obiektu RegisterWindowMessage, używam GUIDGEN, aby utworzyć ciąg znaków i umieścić czytelny dla człowieka prefiks specyficzny dla aplikacji na wynikowym gobbledygook, aby pomóc mi rozróżnić wiele wiadomości w kodzie.

Obstawiaj głupotę swoich kolegów - zawsze jest to wygrany zakład.

Jeśli chcesz autorytatywne tło dla tego całego tematu, zobacz here. Nie, to nie jest moja strona internetowa, to jest Joe Newcomera.

+0

"ponieważ ludzie wykradli kryształ nieskończonej głupoty od Bogów" Lepiej głupi ludzie niż głupi Bogowie;) – Ben

1
  • Jeśli utworzono okno klasy, można użyć zakresu WM_USER (lub WM_APP)
  • Jeśli nie jest to klasa, można użyć WM_APP
  • Jeśli chcesz transmitować wiadomość do każde okno najwyższego poziomu, zarejestruj swoją własną wiadomość globalną za pomocą usługi RegisterWindowMessage
Powiązane problemy