Fórum Saber quando o mouse entra e sai de um TForm #377024
06/05/2010
0
preciso saber quando o mouse entra num TForm e quando o mesmo sai do TForm.
O TForm tem vários componentes digo isso porque os eventos do form mouseenter e mouseleave só funcionam com o form vázio ou não tô sabendo fazer isso...
Carlos Phelippe
Curtir tópico
+ 0Posts
06/05/2010
Wilson Junior
var Dentro: Boolean; procedure TForm1.FormMouseEnter(Sender: TObject); var Posicao: TPoint; begin if Dentro then Exit ; GetCursorPos( Posicao ); if ( (Posicao.X >= Self.Left) and (Posicao.X <= (Self.Left + Self.Width)) ) or ( (Posicao.Y >= Self.Top) and (Posicao.Y <= (Self.Top + Self.Height)) ) then begin Dentro := True; ShowMessage( 'To Dentro' ); end ; end; procedure TForm1.FormMouseLeave(Sender: TObject); var Posicao: TPoint; begin GetCursorPos( Posicao ); if ( Posicao.X < Self.Left ) or ( Posicao.Y < Self.Top ) or ( Posicao.X > (Self.Left + Self.Width) ) or ( Posicao.Y > (Self.Top + Self.Height) ) then begin Dentro := False; ShowMessage( 'To fora' ); end ; end;
Espero ter colaborado.
Gostei + 0
06/05/2010
Carlos Phelippe
você testou com vários componente na tela?
Por exemplo um TPanel que ocupe a tela inteira(alclient)?
Gostei + 0
06/05/2010
Wilson Junior
Espero ter colaborado.
Gostei + 0
06/05/2010
Carlos Phelippe
preciso que quando o mouse esta sobre o formulário o alphablend -> false quando ele fica fora do form alphablend -> true entenderam?
Infelizmente com as dicas recebidas ainda não consegui resolver.
Gostei + 0
06/05/2010
Wilson Junior
Gostei + 0
06/05/2010
Carlos Phelippe
Gostei + 0
07/05/2010
Carlos Mazzi
Gostei + 0
07/05/2010
Raimundo Melo
Fala aew cara...blz??
Vc pode fazer isso usando Hook Procedure de Mouse....
Vou fazer um exemplo e mandar pra vc...
Gostei + 0
07/05/2010
Raimundo Melo
você testou com vários componente na tela?
Por exemplo um TPanel que ocupe a tela inteira(alclient)?
Fala aew cara..blz?? Como prometido, vai o exemplo...não é um bicho de 7 cabeças...
Primeiro, declare na seção private do seu form a seguinte variável:
private
{ Private declarations }
HookHandle : HWND;//Variável para armazenar o handle da nossa hook procedure.
Agora, acima da declaração do seu form declare a seguinte constante:
Const WH_MOUSE_LL = 14;//Constante que contém o valor da hook global de mouse.
Agora, vamos para a nossa função que receberá as notificações do sistema operacional sempre que o mouse gerar uma msg no sistema.
Abaixo da seção Implementation escreve o seguinte código:
Function GlobalMouseHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LRESULT; StdCall;//Função de callback que receberá as notificações de mouse.
Var CursorPosition : TPoint;//Variável para receber as coordenadas do mouse.
Begin
GetCursorPos(CursorPosition);//Receberá as coordenadas do mouse.
If WindowFromPoint(CursorPosition) = Form1.Handle Then//Se o handle retornado for igual ao do form, então o mouse está na área do form.
ShowMessage('Mouse na área do form.');
Result := CallNextHookEx(Form1.HookHandle, Code, wParam, lParam);//Diz ao Sistema operacional para processar normalmente a mensagem gerada pelo mouse.
End;
Agora no onShow do seu formulário escreva o seguinte código:
Self.HookHandle := SetWindowsHookEx(WH_MOUSE_LL, @GlobalMouseHook, 0, 0);//Registra nossa função de callback e retorna o seu id na hook chain do sistema operacional
E para finalizar, devemos avisar ao sistema operacional que a aplicação não mais deverá receber notificações de mensagens geradas pelo mouse.
No onClose do seu form, coloque o seguinte código:
Self.HookHandle := SetWindowsHookEx(WH_MOUSE_LL, @GlobalMouseHook, 0, 0);//Registra nossa função de callback e retorna o seu id na hook chain do sistema operacional
Agora sim, vc pode colocar quantos controles visuais vc quiser.....não tem problema.
Eu testei aq com panels, buttons....e o resultado foi o mesmo...
Espero ter ajudado...
Flw.
Gostei + 0
07/05/2010
Raimundo Melo
UnhookWindowsHookEx(Self.HookHandle);//Remove da hook chain o id da nossa função de callback.
espero ter ajudado...flw.
Gostei + 0
07/05/2010
Carlos Phelippe
O problema agora ocorre quando tenho duas janelas criadas da mesma classe e um esta com uma parte sobre a outra.... Nesse caso o GetCursorPos(pt) retorna o ponto onde tem os dois forms...
Teria que descobrir quem esta acima de quem.... qual form esta na frente....
Gostei + 0
10/05/2010
Carlos Phelippe
Gostei + 0
15/05/2010
Carlos Phelippe
Gostei + 0
18/05/2010
Carlos Phelippe
Gostei + 0
24/05/2010
Carlos Phelippe
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)