Conecte o mouse para capturar eventos fora de um aplicativo

Aprenda a rastrear a atividade do mouse, mesmo quando o aplicativo Delphi não estiver ativo, bandeja ou faz não tem nenhuma interface do usuário em absoluto.

Ao instalar um gancho de mouse em todo o sistema (ou global), você pode monitorar o que o usuário está fazendo com o rato e aja de acordo.

O que é um gancho e como funciona?

Em resumo, um gancho é um (ligue de volta) você pode criar como parte de uma DLL (biblioteca de links dinâmicos) ou o seu aplicativo para monitorar os 'acontecimentos' dentro do sistema operacional Windows.
Existem 2 tipos de ganchos - global e local. Um gancho local monitora as coisas acontecendo apenas para um programa (ou thread) específico. Um gancho global monitora o sistema inteiro (todos os threads).

Para criar um gancho global, você precisa de 2 projetos, 1 para criar o arquivo executável e 1 para criar uma DLL contendo o procedimento de gancho.

Nosso artigo sobre trabalhando com ganchos de teclado da Delphi explica como interceptar a entrada do teclado para controles que não podem receber o foco de entrada (como TImage).

instagram viewer

Conectando o mouse

Por design, o movimento do mouse é restrito pelo tamanho da tela da área de trabalho (incluindo a Barra de Tarefas do Windows). Quando você move o mouse para a borda esquerda / direita / superior / inferior, o mouse "para" - como esperado (se você não tiver mais de um monitor).

Aqui está uma idéia para o gancho do mouse em todo o sistema: Se, por exemplo, você deseja mover o mouse para o lado direito da tela quando ele se move em direção à borda esquerda (e a "toca"), você pode escrever um gancho de mouse global para reposicionar o mouse ponteiro.

Você começa criando um projeto de biblioteca de vínculo dinâmico. A DLL deve exportar dois métodos: "HookMouse" e "UnHookMouse".

O procedimento HookMouse chama o SetWindowsHookEx API passando o "WH_MOUSE" para o primeiro parâmetro - instalando assim um procedimento de gancho que monitora as mensagens do mouse. Um dos parâmetros para o SetWindowsHookEx é a função de retorno de chamada que o Windows chamará quando houver uma mensagem do mouse a ser processada:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

O último parâmetro (valor = 0) no SetWindowsHookEx define que estamos registrando um gancho global.

O HookProc analisa as mensagens relacionadas ao mouse e envia uma mensagem personalizada ("MouseHookMessage") ao nosso projeto de teste:

função HookProc (nCode: Inteiro; MsgID: WParam; Dados: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: booleano;

 MouseDirection: TMouseDirection;

início

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = false;


E se (mousePoint. X = 0) então

início

 Janelas. SetCursorPos (-2 + Tela. Largura, mousePoint.y);

 notifyTestForm: = true;

 MouseDirection: = mdRight;

fim;

...
E se notifyTestForm então

início

 PostMessage (FindWindow ('TMainHookTestForm', zero), MouseHookMessage, MsgID, Número inteiro (MouseDirection));

fim;

Resultado: = CallNextHookEx (Hook, nCode, MsgID, Data);
fim;

Gorjeta: Leia os arquivos de Ajuda do Win32 SDK para descobrir sobre o registro PMouseHookStruct e a assinatura da função HookProc.

Nota: Uma função de gancho não precisa enviar nada para qualquer lugar - a chamada PostMessage é usada apenas para indicar que a DLL pode se comunicar com o mundo "externo".

Gancho do mouse "Ouvinte"

A mensagem "MouseHookMessage" é postada no seu projeto de teste - um formulário chamado "TMainHookTestForm". Você substituirá o método WndProc para obter a mensagem e agir conforme necessário:

procedimento TMainHookTestForm. WndProc (var Mensagem: TMessage);

início

herdado WndProc (mensagem);

E se Mensagem. Msg = HookCommon. MouseHookMessage então

início

// implementação encontrada no código que acompanha

 Sinal (TMouseDirection (Mensagem. LParam));

fim;

fim;

Obviamente, quando o formulário é criado (OnCreate), você chama o procedimento HookMouse da DLL, quando é fechado (OnDestroy), o procedimento UnHookMouse.

Nota: Os ganchos tendem a desacelerar o sistema porque aumentam a quantidade de processamento que o sistema deve executar para cada mensagem. Você deve instalar um gancho somente quando necessário e removê-lo o mais rápido possível.