Entenda como Funcionam Janelas e Mensagens no Windows
05/02/2025
Sistema de janelas do Windows, filas de eventos de mouse e teclado, parâmetros de msgs. Monitor eventos com Spy++. Id: 21

O Sistema de Janelas do Windows
Introdução
O Windows opera com um sistema de janelas baseado em eventos, que gerencia interações do usuário com o mouse, teclado e outros dispositivos. Cada janela no Windows pertence a uma thread e possui sua própria fila de mensagens (message queue). O Gerenciador de Janelas do Windows (Windows Manager) processa essas mensagens e repassa para as janelas apropriadas.
Sem que o usuário perceba, cada uma das dezenas (ou centenas) de janelas ativas no momento está processando, em um loop permanente, a filtragem das mensagens de eventos recebidas. E deve reagir de acordo com o que foi programado para cada situação. Por exemplo, se um determinado aplicativo foi programado para encerrar após o clique na tecla de escape, no loop da janela em que isso é controlado, haverá uma condição (um "if") para verificar se chegou uma mensagem de informação de que o usuário clicou escape.
Filas de Eventos: Mouse e Teclado
O sistema de janelas do Windows utiliza mensagens para lidar com eventos de entrada. As principais filas de eventos incluem:
WM_MOUSEMOVE
- Disparado quando o mouse se move.WM_LBUTTONDOWN
- Clique com o botão esquerdo do mouse.WM_RBUTTONDOWN
- Clique com o botão direito do mouse.WM_MBUTTONDOWN
- Clique com o botão do meio do mouse.WM_MOUSEWHEEL
- Movimento da roda do mouse.WM_KEYDOWN
- Pressionamento de tecla.WM_KEYUP
- Liberação de tecla.WM_CHAR
- Envio de um caractere ao buffer do teclado.WM_SYSKEYDOWN
- Pressionamento de tecla do sistema (como Alt).
Parâmetros das Mensagens
Cada mensagem de janela contém parâmetros adicionais, geralmente wParam
e lParam
, que fornecem informações sobre o evento. Por exemplo:
wParam
pode indicar qual tecla foi pressionada emWM_KEYDOWN
.lParam
pode conter informações sobre a posição do cursor no eventoWM_MOUSEMOVE
.
Janelas Ocultas do Windows
O Windows mantém várias janelas ocultas para gerenciar serviços do sistema, incluindo:
- Progman - Responsável pelo Desktop.
- WorkerW - Suporte a elementos visuais e widgets.
- DDE Server Window - Comunicação entre processos.
- Shell_TrayWnd - Barra de tarefas do Windows.
- Default IME - Gerencia entrada de texto internacional.
Essas janelas operam continuamente sem que o usuário perceba, executando tarefas essenciais ao funcionamento do sistema.
O Windows Message System e o Loop de Mensagens
Mensagens e Filtros de Eventos: O Windows utiliza um sistema de mensagens para enviar e receber eventos entre o sistema operacional e as aplicações. Esse sistema é responsável por capturar eventos do usuário (como pressionamento de teclas ou movimentos do mouse) e passar para a janela ou aplicativo adequado.
O Message Loop:
Cada janela do aplicativo possui um loop que processa eventos de forma contínua e independente. Esse loop fica esperando mensagens do sistema e, assim que uma mensagem é recebida, o código dentro do loop processa essa mensagem.
O loop básico de mensagens pode ser representado por algo como:
//Código cppMSG msg;while (GetMessage(&msg, nullptr, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}
Nesse loop, o sistema pega uma mensagem da fila de mensagens (GetMessage), traduz a mensagem para uma forma mais acessível (se necessário) e a despacha para o procedimento de janela da aplicação (DispatchMessage), onde será tratada.
Cada janela possui um identificador único, denominado hWnd, que é a abreviação para "handle to a window".
hWnd é um tipo de dado usado no Windows para representar um identificador de janela (handle). Ele é essencial para que o sistema operacional e os aplicativos possam distinguir e se comunicar com diferentes janelas.
Filtragem de Mensagens e Reação ao Teclado: o loop verifica uma condição, como o pressionamento da tecla Escape. Esse é um exemplo do tipo de processamento que acontece dentro do message loop. Esse filtro é geralmente feito dentro da função que processa a mensagem da janela. A função pode ser algo como:
//Código cppLRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_KEYDOWN:if (wParam == VK_ESCAPE) {PostQuitMessage(0);}break;// outros casos de mensagens}return DefWindowProc(hwnd, uMsg, wParam, lParam);}
Tempo Aproximado de Processamento de Cada Loop: O tempo de execução de cada iteração do message loop depende de vários fatores, como a complexidade das operações feitas para cada evento. Porém, de maneira geral, a execução de um message loop no Windows é bastante eficiente.
Filtragem de Eventos: Como o loop do Windows fica esperando eventos e respondendo a eles, o tempo de processamento pode variar dependendo da carga do sistema. Normalmente, o tempo de cada iteração de um loop de mensagens é da ordem de milissegundos (ms), com eventos sendo processados em uma média de 1 a 5ms.
Execução de "if" e Ação (Tecla Escape): Quando um evento, como pressionar a tecla Escape, é recebido, o tempo de execução da verificação (if) e a reação (como PostQuitMessage) geralmente é muito rápido, possivelmente na ordem de microssegundos (μs). O tempo total de execução pode ser bem inferior a 1ms, dependendo da complexidade da operação dentro do loop.
Processamento Paralelo e Responsividade: O Windows, em si, não cria um loop de mensagens para cada janela de maneira paralela, mas pode simular tal comportamento usando múltiplas threads ou processos, permitindo que várias janelas ou aplicativos reaja simultaneamente de maneira independente.
Visualizando Eventos de Mouse no Spy++
O Spy++ é uma ferramenta da Microsoft que permite monitorar eventos de janelas.
Localização do Spy++
A ferramenta Spy++ está localizada no diretório padrão de instalação do Visual Studio:
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\SpyXX.exe
Para visualizar mensagens de aplicativos x64 use a versão spyxx_amd64.exe
Passo a passo para verificar mensagens referentes a eventos específicos:
- Abra o Spy++.
- No menu Spy, clique em Messages.
- Selecione a janela alvo clicando no botão de captura de janelas.
- Marque eventos relacionados ao mouse, como
WM_MOUSEMOVE
,WM_LBUTTONDOWN
eWM_RBUTTONDOWN
. - Pressione OK para começar a captura.
- Observe os eventos sendo registrados em tempo real.
A API do Windows
A API do Windows (Application Programming Interface) refere-se ao conjunto de interfaces e funções fornecidas pelo sistema operacional Windows para permitir que desenvolvedores criem e interajam com programas e aplicativos que rodem nesse sistema. Em outras palavras, é um conjunto de ferramentas e protocolos que permite que os desenvolvedores acessem os recursos e funcionalidades do Windows, como interfaces gráficas, gerenciamento de arquivos, comunicação entre processos, manipulação de janelas e muitos outros aspectos de um sistema operacional.
Componentes principais da API do Windows:
Win32 API: A Win32 API (ou simplesmente Windows API) é o conjunto original de funções de 32 bits fornecidas pelo Windows. Ela inclui funções que, dentre outras finalidades, lidam com:
Gerenciamento de janelas:
Como criar, destruir e manipular janelas, obter informações sobre as janelas, responder a eventos de teclado e mouse.
Manipulação de arquivos e diretórios: Funções para ler, escrever, mover ou excluir arquivos e diretórios.
Gerenciamento de memória: Funções para alocar, liberar e manipular blocos de memória.
Processos e threads: Funções para criar e gerenciar processos e threads, sincronizar entre diferentes partes de um programa.
Entrada e saída (I/O): Funções para interagir com dispositivos, como discos, impressoras e outros periféricos.
Eventos e mensagens: Comunicação entre diferentes partes do sistema e aplicação por meio de mensagens e eventos.
Componente COM (Component Object Model): O COM é uma parte importante da API do Windows que permite a comunicação entre diferentes objetos e componentes de software. Ele oferece uma maneira de os aplicativos interagirem com objetos, sejam eles locais ou remotos, de maneira independente da linguagem de programação.
Como a API do Windows funciona?
Quando você desenvolve um aplicativo para Windows, você faz chamadas para as funções da API do Windows para realizar tarefas como desenhar na tela, responder a eventos do teclado e do mouse, gerenciar arquivos, entre outras operações. Por exemplo:
Se você deseja criar uma janela, você chamaria funções como CreateWindow() ou CreateWindowEx().
Para responder a um clique do mouse, o sistema operacional envia uma mensagem para o loop de mensagens do aplicativo, que pode ser processada por funções da API.
Essas funções são implementadas em bibliotecas de vínculo dinâmico (DLLs), como user32.dll (responsável pelas operações com a interface gráfica), kernel32.dll (responsável por funções do sistema e gerenciamento de memória) e gdi32.dll (para manipulação gráfica).
Exemplo de uso da API do Windows:
Para ilustrar, se você quiser enviar uma mensagem para uma janela para que ela feche, você pode usar a função PostMessage() que é parte da API do Windows. Aqui está um exemplo básico em C:
Código em C#include <windows.h>int main() {HWND hwnd = FindWindow(NULL, "Nome da Janela"); // Encontra a janela pelo nomeif (hwnd != NULL) {PostMessage(hwnd, WM_CLOSE, 0, 0); // Envia a mensagem de fechamento}return 0;}
Neste exemplo:
FindWindow() é uma função da API do Windows usada para localizar uma janela específica.
PostMessage() envia uma mensagem para essa janela, que, no caso, solicita que a janela seja fechada (WM_CLOSE).
Conclusão
O sistema de janelas do Windows é baseado em mensagens que trafegam entre processos e threads. Ferramentas como o Spy++ permitem inspecionar essas mensagens e entender melhor o funcionamento interno do sistema. Além disso, conhecer as mensagens e seus parâmetros pode ser essencial para desenvolvedores que trabalham diretamente com a API do Windows.