Loop de mensagem

Um loop de mensagem simples consiste em uma função chamada para cada uma destas três funções: GetMessage, TranslateMessagee DispatchMessage.

MSG msg;

ao mesmo tempo (GetMessage (amp; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

O GetMessage função recupera uma mensagem da fila e o copia para uma estrutura de tipo MSG. Retorna um valor diferente de zero, a menos que ele encontra a mensagem WM_QUIT , no caso, ela retorna FALSE e termina o executar um loop. Em um aplicativo de Simples-threaded, terminar o loop de mensagem é frequentemente o primeiro passo para fechar o aplicativo. Um aplicativo pode terminar seu próprio loop usando o PostQuitMessage função, geralmente em resposta à mensagem WM_DESTROY no procedimento de janela da janela principal do aplicativo.

Se você especificar um identificador de janela como o segundo parâmetro de GetMessage, somente as mensagens para a janela especificada são recuperadas da fila. GetMessage também pode filtrar mensagens na fila, recuperando apenas as mensagens que caem dentro de um intervalo especificado. Para obter mais informações sobre filtragem de mensagens, consulte Filtragem de mensagens.

Loop de mensagem do thread deve incluir TranslateMessage se o thread deve receber entrada caractere do teclado. O sistema gera mensagens de chave virtual (WM_KEYDOWN e WM_KEYUP) cada vez que o usuário pressiona uma chave. Uma mensagem de chave virtual contém um virtual-código de chave que identifica qual tecla foi pressionada, mas não o valor de caractere. Para recuperar esse valor, o loop de mensagem deve conter TranslateMessage, que traduz a mensagem chave virtual em uma mensagem de caráter (WM_CHAR) e coloca-a volta para a fila de mensagem do aplicativo. A mensagem caractere pode ser removida após uma subsequente iteração do loop de mensagem e enviada para um procedimento de janela.

A função DispatchMessage envia uma mensagem para o procedimento janela associado com o identificador de janela especificado na estrutura de MSG . Se o identificador de janela é HWND_TOPMOST, DispatchMessage envia a mensagem para os procedimentos de janela de alto nível todas as janelas no sistema. Se o identificador de janela é NULL, DispatchMessage não faz nada com a mensagem.

Thread principal do aplicativo inicia seu loop de mensagem depois de inicializar o aplicativo e criar pelo menos uma janela. Uma vez iniciado, o loop de mensagem continua a recuperar mensagens da fila de mensagem do thread e ao seu envio para o apropriado do windows. O loop de mensagem termina quando o GetMessage função remove a mensagem WM_QUIT da fila de mensagens.

Executar um loop mensagem apenas uma é necessária para uma fila de mensagem, mesmo se um aplicativo contém muitas janelas. DispatchMessage sempre distribui a mensagem para a janela apropriada; Isso ocorre porque cada mensagem na fila é uma estrutura de MSG que contém o identificador da janela à qual pertence a mensagem.

Você pode modificar um loop de mensagem em uma variedade de maneiras. Por exemplo, você pode recuperar mensagens da fila sem distribuindo-los para uma janela. Isso é útil para aplicativos que postagem mensagens não especificar uma janela. Você pode também direto GetMessage para procurar mensagens específicas, deixando outras mensagens na fila. Isso é útil se você deve usar temporariamente a ordem FIFO habitual da fila de mensagem.

Um aplicativo que usa teclas de aceleração deve ser capaz de traduzir as mensagens do teclado para mensagens de comando. Para fazer isso, o loop de mensagem do aplicativo deve incluir um chamar para o TranslateAccelerator função. Para obter mais informações sobre teclas de aceleração, consulte Aceleradores de teclado.

Se um segmento usa uma caixa de diálogo sem janela restrita, o loop de mensagem deve incluir o IsDialogMessage função para que a caixa de diálogo pode receber entrada do teclado.

Index