O que é uma mensagem?
Quando utilizamos o Windows e clicamos em um botão, minimizamos uma janela ou pressionamos uma tecla no teclado, é enviada uma mensagem para notificar alguma aplicação do ocorrido.
Tipos de mensagens
Na Tabela 1 temos uma lista das mensagens mais comuns que o Windows emite
Nome |
Notificação |
WM_ACTIVE |
Ativação ou desativação |
WM_CHAR |
Alguma tecla enviou WM_KEYDOWN e WM_KEYUP |
WM_CLOSE |
Encerrar operação |
WM_KEYDOWN |
Uma está pressionada |
WM_KEYUP |
Uma tecla foi liberada |
WM_LBUTTONDOWN |
O botão esquerdo do mouse está pressionado |
WM_MOUSEMOVE |
O mouse está em movimento |
WM_PAINT |
A área cliente deve ser refeita (repintada) |
WM_TIMER |
Um evento timer foi disparado |
WM_QUIT |
Foi solicitado o término de algum programa |
Tabela 1. Tipos de Mensagens
A composição de uma mensagem
Uma mensagem nada mais é do que um tipo Record, que é passado para alguma aplicação. Nesse record temos informações mais detalhadas sobre a mensagem emitida, como seu tipo, destinatário. Na Tabela 2 temos a lista de campos que compõe o record TMsg – que é assim que é chamado.
Campo |
Tipo |
Descrição |
Hwnd |
HWND |
Handle da janela que espera pela janela |
Message |
UINT |
Identificador da mensagem, contante. |
wParam |
WPARAM |
32 bits de informações adicionais sobre a mensagem |
lParam |
LPARAM |
32 bits de informações adicionais sobre a mensagem |
Time |
DWORD |
A hora que a mensagem foi criada |
Pt |
TPoint |
Posição do mouse quando a mensagem foi criada |
Tabela 2. Composição do record de mensagem (TMsg)
Manipulando as mensagens
Quando uma aplicação manipula ou processa uma mensagem é entendido que a aplicação responde de alguma forma a uma mensagem do Windows. O Delphi permite que nós, desenvolvedores, criemos aplicações que possam responder a mensagens especificas de uma forma bem simples. Podemos criar uma procedure para cada tipo de mensagem que desejamos tratar. Porém essas procedures devem objetos a alguns critérios:
· A procedure deve ser um método de um objeto
· A procedure deve possuir em sua lista de parâmetros um VAR do tipo TMessage ou outros tipos específicos de mensagem, veja tabela 2
· A procedure deve ser assinalada com a diretiva message seguida pela constante, nome, da messagem que será tratada.
Abaixo temos um exemplo de como seria essa procedure para o evento WM_PAINT.
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
Uma ótima sugestão para nomear essas procedures é dar-lhes o nome da mensagem que irão manipular , usando a formatação CamelCase sem o sublinhado, conforme visto acima.
Um pequeno exemplo
Vamos criar um exemplo que irá manipular a mensagem WM_PAINT. Sempre que essa mensagem for emitida pelo windows, nossa aplicação responderá emitindo um pequeno bit.
Inicie um novo projeto no Delphi. No formulário principal da aplicação adicione em sua seção privada o método da Listagem 1 e o implemente conforme Listagem 2. Execute a aplicação e veja o resultado.
Listagem 1. Assinatura do método
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
Listagem 2. Implementação
procedure TForm1.WMPaint(var Msg: TWMPaint);
begin
MessageBeep(0);
inherited;
end;
Conclusão
Após entender o que são as mensagens do Windows e saber que o Delphi fornece meios fáceis para interceptá-las podemos avançar um pouco mais no tratamento de mensagens. Podemos por exemplo fazer uma aplicação que fica armazenando as teclas digitadas pelo usuário... é isso que um trojan keylogger faz.
Fica “escutando” o evento que é disparado quando as teclas são pressionadas. Podemos também enviar mensagens para alguma janela do windows mandando fechá-la por exemplo. No próximo artigo mais ver um pouco mais de como utilizar as mensagens do windows em aplicações Delphi.
Até a próxima