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