2012-09-05 16 views
7

programmi Win32 in genere hanno un ciclo di messaggi che loop chiamando GetMessage o PeekMessage, e quindi chiama DispatchMessage di inviare il messaggio alla finestra proceedure della relativa finestra.È necessario chiamare DispatchMessage nei programmi win32?

Ma è davvero necessario farlo? Posso invece cercare nell'oggetto MSG direttamente nel loop dei messaggi ed eseguire le azioni necessarie senza chiamare DispatchMessage? Sto parlando di casi in cui ho una sola finestra senza altri controlli della finestra, ad esempio se la finestra viene utilizzata solo come finestra di visualizzazione direct3d, quindi i messaggi verranno sempre indirizzati all'unica finestra.

Principalmente sono solo curioso ma potrebbe anche portare a certi aspetti del mio codice che sono anche più puliti.

risposta

12

Si chiama DispatchMessage per inviare il messaggio alla finestra corretta, al suo "finestra proc". Pensi di avere solo una finestra, ma è davvero l'unica? COM creerà finestre di supporto, altri sottosistemi potrebbero creare anche finestre nascoste di supporto, che consegneranno i messaggi inviati alla coda dei messaggi condivisa e indirizzati a tali finestre. Senza dover pensare molto a questi dettagli hai API per spedirli. E devi farlo perché quei sottosistemi fanno affidamento sulla presenza di message pump.

Spy++ Lo strumento Windows SDK può aiutarti a vedere quante finestre hai davvero.

Tuttavia, se si dispone effettivamente dell'unica finestra, non fa molta differenza se il gestore viene chiamato da interni di DispatchMessage o direttamente dal proprio message pump.

+0

Questo ha senso, grazie! – jcoder

+1

'DispatchMessage' e' CallWindowProc' fanno anche cose come considerare gli hook di Windows. Anche con una singola finestra è necessario utilizzarli. Credo che alcuni messaggi non possano essere elaborati correttamente al di fuori di "DispatchMessage", ma non ho esempi in cima alla mia testa. Forse cose come 'WM_PAINT'. – tenfour

+1

@tenfour, forse più correttamente è dire che alcuni messaggi saranno comunque chiamati tramite WindowProc e non esisteranno come messaggi separati sulla coda. Quindi, WindowProc è un must in ogni caso. Ancora quelli pubblicati in coda possono essere gestiti in entrambi i modi. Non riesco a pensare ai motivi per cui uno vorrebbe gestirli proprio lì sul lato della pompa. –

Problemi correlati