2012-09-05 13 views
7

programów Win32 zazwyczaj mają pętlę wiadomość, że pętle wzywającą GetMessage lub PeekMessage, a następnie wywołuje DispatchMessage aby wysłać wiadomość do proceedure okna danego okna.Czy wywołanie funkcji DispatchMessage w programach win32 jest konieczne?

Czy jest jednak taka potrzeba? Czy mogę zamiast tego po prostu zaglądać do obiektu bezpośrednio w pętli komunikatów i wykonywać tam potrzebne akcje bez wywoływania: DispatchMessage? Mówię o przypadkach, w których mam jedno pojedyncze okno bez żadnych okien sterujących, na przykład, jeśli okno jest używane tylko jako okno wyświetlania direct3d, więc wiadomości będą zawsze kierowane do jedynego okna.

W większości jestem ciekawy, ale może to również prowadzić do tego, że niektóre aspekty mojego kodu są również bardziej przejrzyste.

Odpowiedz

12

Zadzwoń pod numer DispatchMessage, aby wiadomość została dostarczona do odpowiedniego okna, do jej "proc okna". Myślisz, że masz tylko jedno okno, ale czy to naprawdę jedyne? COM utworzy okna pomocnicze, inne podsystemy mogą również tworzyć ukryte okna pomocnicze, które będą dostarczać wiadomości wysłane do wspólnej kolejki wiadomości i zaadresowane do tych okien. Bez konieczności dokładnego myślenia o tych szczegółach masz API do ich wysyłania. I musisz to zrobić, ponieważ te podsystemy polegają na obecności pompy komunikatów.

Spy++ Narzędzie Windows SDK może pomóc w sprawdzeniu, ile okien naprawdę posiadasz.

Nadal, jeśli rzeczywiście masz jedyne okno, nie ma większego znaczenia, czy wywoływacz jest wywoływany z wewnętrznych obiektów DispatchMessage, czy bezpośrednio przez pompę komunikatów.

+0

To ma sens, dzięki! – jcoder

+1

'DispatchMessage' oraz' CallWindowProc' również robią rzeczy takie jak rozważanie haków do okien. Nawet z jednym oknem, musisz ich użyć. Uważam, że niektóre wiadomości nie mogą być przetwarzane poprawnie poza 'DispatchMessage', ale nie mam żadnych przykładów z góry mojej głowy. Może rzeczy takie jak 'WM_PAINT'. – tenfour

+1

@tenfour, być może bardziej poprawnie jest powiedzieć, że niektóre wiadomości będą w każdym razie wywoływane przez WindowProc, i nie będzie istnieć jako osobny komunikat w kolejce. W każdym razie WindowProc jest koniecznością. Mimo to te umieszczone w kolejce mogą być obsługiwane w obie strony. Nie mogę wymyślić powodów, dla których ktoś chciałby sobie z nimi poradzić po stronie pompy. –

Powiązane problemy