Ocasionalmente, um aplicativo precisa examinar o conteúdo da fila de mensagem do thread de fora de loop de mensagem do thread. Por exemplo, se um procedimento janela aplicativo executa uma operação de desenho longa, você poderá o usuário seja capaz de interromper a operação. A menos que seu aplicativo analisa periodicamente a fila de mensagens durante a operação para mouse e teclado mensagens, ele não responderá a entrada até depois de concluída a operação do usuário. A razão para isto é que o DispatchMessage função no loop de mensagem do thread não retorna até que o procedimento janela termina o processamento de uma mensagem.
Você pode usar a PeekMessage função para examinar uma fila de mensagens durante uma operação demorada. PeekMessage é semelhante à função GetMessage ; tanto verifique uma fila de mensagens para uma mensagem que corresponde aos critérios de filtro e, em seguida, copiar a mensagem para um estrutura de MSG . A principal diferença entre as duas funções é que GetMessage não retorna até que uma mensagem correspondentes aos critérios de filtro é colocada na fila, enquanto PeekMessage retorna imediatamente, independentemente de se uma mensagem estiver na fila.
O exemplo a seguir mostra como usar PeekMessage para examinar uma fila de mensagens para cliques de mouse e entrada do teclado durante uma operação longa.
HWND hwnd;
BOOL fDone;
MSG msg;
/ / Iniciar a operação e continuar até que seja concluída / / ou até que o usuário clica o mouse ou pressiona uma tecla.
fDone = F&ALSE;
enquanto (! fDone) {fDone = DoLengthyOperation(); / / aplicativo-defined função / / Remove todas as mensagens que podem estar na fila. Se o / / fila contém qualquer mouse ou teclado / / mensagens, finalizar a operação.
ao mesmo tempo (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {caso WM_LBUTTONDOWN: WM_RBUTTONDOWN de caso: case WM_KEYDOWN: / / / / executar qualquer limpeza necessária.
/ / fDone = TRUE;
}
}
}
Outras funções, incluindo GetQueueStatus e GetInputState, também permitem que você examinar o conteúdo da fila de mensagem do thread. GetQueueStatus retorna uma matriz de sinalizadores que indica os tipos de mensagens em fila; usá-lo é o modo mais rápido para descobrir se a fila contém todas as mensagens. GetInputState retorna TRUE se a fila contém mensagens de mouse ou teclado. Essas duas funções podem ser usadas para determinar se a fila contém mensagens que precisam ser processadas.