Examinando uma fila de mensagens

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.

Index