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).
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.