Saber quando o mouse entra e sai de um TForm

Delphi

06/05/2010

Olá pessoal,
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

Carlos Phelippe

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

06/05/2010

Implemente assim

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
Carlos Phelippe

Carlos Phelippe

06/05/2010

Amigo,
você testou com vários componente na tela?
Por exemplo um TPanel que ocupe a tela inteira(alclient)?
GOSTEI 0
Wilson Junior

Wilson Junior

06/05/2010

Se o seu TPanel esta alCliente, coloque estes eventos para ele também.

Espero ter colaborado.
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

Infelizmente não funciona como desejo ainda...

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
Wilson Junior

Wilson Junior

06/05/2010

Mesmo para quando o form não estiver ativo?
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

sim.


GOSTEI 0
Carlos Mazzi

Carlos Mazzi

06/05/2010

Porque nao usa oevento OnmouseMove??? nao dá certo para o que vc precisa?
GOSTEI 0
Raimundo Melo

Raimundo Melo

06/05/2010

 
Fala aew cara...blz??

Vc pode fazer isso usando Hook Procedure de Mouse....

Vou fazer um exemplo e mandar pra vc...
GOSTEI 0
Raimundo Melo

Raimundo Melo

06/05/2010

Amigo,
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
Raimundo Melo

Raimundo Melo

06/05/2010

  Só para corrigir, no onClose do seu form, coloque:


UnhookWindowsHookEx(Self.HookHandle);//Remove da hook chain o id da nossa função de callback.




espero ter ajudado...flw.
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

Tá quase lá...

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
Carlos Phelippe

Carlos Phelippe

06/05/2010

Sobe!
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

Infelizmente ainda não consegui o resultado que preciso.
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

Ainda não obtive sucesso 
GOSTEI 0
Carlos Phelippe

Carlos Phelippe

06/05/2010

Ainda buncando uma solução
GOSTEI 0
Carlos Mazzi

Carlos Mazzi

06/05/2010

Meu colega, usando evento OnMouseMove, nao dá certo? eu fiz um teste aqui e funcionou corretamente...

GOSTEI 0
POSTAR