Fórum Saber quando o mouse entra e sai de um TForm #377024

06/05/2010

0

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

Responder

Posts

06/05/2010

Wilson Junior

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

Gostei + 0

06/05/2010

Carlos Phelippe

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

Gostei + 0

06/05/2010

Wilson Junior

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

Espero ter colaborado.
Responder

Gostei + 0

06/05/2010

Carlos Phelippe

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.


Responder

Gostei + 0

06/05/2010

Wilson Junior

Mesmo para quando o form não estiver ativo?
Responder

Gostei + 0

06/05/2010

Carlos Phelippe

sim.


Responder

Gostei + 0

07/05/2010

Carlos Mazzi

Porque nao usa oevento OnmouseMove??? nao dá certo para o que vc precisa?
Responder

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

Gostei + 0

07/05/2010

Raimundo Melo

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.

Responder

Gostei + 0

07/05/2010

Raimundo Melo

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

Gostei + 0

07/05/2010

Carlos Phelippe

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

Gostei + 0

10/05/2010

Carlos Phelippe

Sobe!
Responder

Gostei + 0

15/05/2010

Carlos Phelippe

Infelizmente ainda não consegui o resultado que preciso.
Responder

Gostei + 0

18/05/2010

Carlos Phelippe

Ainda não obtive sucesso 
Responder

Gostei + 0

24/05/2010

Carlos Phelippe

Ainda buncando uma solução
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar