Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-11-2008
byfali byfali is offline
Miembro
 
Registrado: Mar 2007
Posts: 24
Poder: 0
byfali Va por buen camino
Llamada WM_MOUSELEAVE en un TrayIcon

Hola amigos del foro.
Tengo una duda que no logro solucionar. Tengo una aplicacion que se minimiza y coloca un TrayIcon en la bandeja y usa los mensajes WM_LBUTTONDOWN o WM_RBUTTONDOWN sin problema.
Pero lo que no logro es que al cituar el puntero del raton sobre el icono muestre cualquier mensaje.
He probado usando WM_MOUSELEAVE y WM_MOUSEHOVER pero no pasa nada.
Espero me podais ayudar, gracias.
Responder Con Cita
  #2  
Antiguo 11-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.174
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
¿Has probado con WM_MOUSEMOVE?

// Saludos
Responder Con Cita
  #3  
Antiguo 11-11-2008
byfali byfali is offline
Miembro
 
Registrado: Mar 2007
Posts: 24
Poder: 0
byfali Va por buen camino
Gracias, roman efectivamente con WM_MOUSEMOVE funciona pero yo quiero que cuando el raton este cituado en el icono muestre un Form y cuando el cursor se retire del icono el form desapasca por eso WM_MOUSELEAVE y WM_MOUSEHOVER.
Responder Con Cita
  #4  
Antiguo 11-11-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: Oct 2006
Posts: 2.159
Poder: 14
cHackAll Va por buen camino
Cita:
Empezado por http://msdn.microsoft.com/en-us/library/ms645615(VS.85).aspx
...The application must call TrackMouseEvent when the mouse reenters its window if it requires further tracking of mouse hover behavior...
Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #5  
Antiguo 11-11-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.630
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Aprovechando el mensaje "WM_MOUSEMOVE" quizás podrías encontrar las coordenadas en que se encuentra el ratón, así como también si estas están "dentro" del "TrayIcon". De este modo podrías acaso implementar lo que necesitas. Muy probablemente me equivoco, pero, me suena que "WM_MOUSELEAVE" y "WM_MOUSEHOVER" son mensajes "nuevos" que no todos los controles soportan. Esto último es igual una tontería, algo que "me suena", pero, sin pies ni cabeza. Lo primero, sin embargo, creo que tiene su lógica.
__________________
David Esperalta
www.davidesperalta.com
Responder Con Cita
  #6  
Antiguo 11-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.174
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Lo de WM_MOUSELEAVE y WM_MOUSEHOVER se uan con la función TrackMouseEvent, pero eso sirve para monitorear el ratón sobre una determinada ventana. En este caso, el icono no está en una de nuestras ventanas sino en la de la bandeja del sistema.

Yo creo que la idea de dec funcionaría si tomamos las coordenadas del ratón en el primer WM_MOUSEMOVE y con un Timer monitorear qué tan alejado está el ratón de esa posición inicial para "saber" si ya salimos del icono.

// Saludos
Responder Con Cita
  #7  
Antiguo 11-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
¿qué componente estás usando para el TrayIcon?

Lo digo porque cada uno implementa o no una función. Usando estrictamente la API de windows, se puede conseguir lo que quieres, de hecho proporciona un campo donde incluir el texto a mostrar a modo de Hint.

Si el componente que usas lo permite (la licencia, tienes el código, etc) puedes hacerlo tú mismo. En caso contrario, usar uno de los muchos que sí lo tienen implementados (JVCL, LMDTOOLS,etc)

Código Delphi [-]
unit Main;

interface

uses
  Classes, Controls, Dialogs, Forms, Graphics, Messages, SysUtils, Windows,
  Buttons, ComCtrls, Menus, ShellApi, StdCtrls;

type
  TwndIconic = class (TForm)
    PopupMenu1: TPopupMenu;
    miClose: TMenuItem;
    N1: TMenuItem;
    miProperties: TMenuItem;
    HotKey1: THotKey;
    HotKey2: THotKey;
    HotKey3: THotKey;
    HotKey4: THotKey;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure miCloseClick(Sender: TObject);
    procedure miPropertiesClick(Sender: TObject);
  private
    FTrayMessage: Cardinal;
    procedure RButtonUp;
    procedure LButtonDblClk;
  protected
    procedure WndProc(var Msg: TMessage); override;
  public
    procedure NotifyTray(Command: Word; const Hint: String);
  end;

var
  wndIconic: TwndIconic;

implementation

uses About;

{$R *.DFM}

resourcestring
  STrayMessage = 'Mad.Dog.Marteens';

procedure TwndIconic.NotifyTray(Command: Word; const Hint: String);
var
  Data: TNotifyIconData;
begin
  Data.cbSize := SizeOf(Data);
  Data.uID    := 0;
  Data.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  Data.Wnd    := Self.Handle;
  Data.uCallbackMessage := FTrayMessage;
  Data.hIcon  := Application.Icon.Handle;
  StrLCopy(Data.szTip, PChar(Hint), SizeOf(Data.szTip)); //<<<<<<<<<<< HINT
  Shell_NotifyIcon(Command, @Data);
end;

procedure TwndIconic.WndProc(var Msg: TMessage);
begin
  if Msg.Msg = FTrayMessage then
    case Msg.LParam of
      WM_RBUTTONUP: RButtonUp;
      WM_LBUTTONDBLCLK: LButtonDblClk;
    end
  else
    inherited WndProc(Msg);
end;

procedure TwndIconic.LButtonDblClk;
begin

  wndiconic.Create(self);
  wndiconic.show;

end;

procedure TwndIconic.RButtonUp;
var
  Pt: TPoint;
begin
  GetCursorPos(Pt);
  SetForegroundWindow(Application.Handle);
  Application.ProcessMessages;
  PopupMenu1.Popup(Pt.X, Pt.Y);
end;

procedure TwndIconic.FormCreate(Sender: TObject);
begin
  Application.ShowMainForm := False;
  ShowWindow(Application.Handle, SW_HIDE);
  FTrayMessage := RegisterWindowMessage(PChar(STrayMessage));
  NotifyTray(NIM_ADD, Application.Title);
end;

procedure TwndIconic.FormDestroy(Sender: TObject);
begin
  NotifyTray(NIM_DELETE, '');
end;

procedure TwndIconic.miCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TwndIconic.miPropertiesClick(Sender: TObject);
begin
  wndiconic.Show;
end;

end.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 11-11-2008 a las 20:32:33.
Responder Con Cita
  #8  
Antiguo 11-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.174
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por Lepe Ver Mensaje
Lo digo porque cada uno implementa o no una función. Usando estrictamente la API de windows, se puede conseguir lo que quieres, de hecho proporciona un campo donde incluir el texto a mostrar a modo de Hint.
Bueno. Yo he presupuesto en todo este hilo, que se quiere usar directamente la API, y no veo de qué forma se puede implementar lo que quiere como no sea con un truco como los que se han esbozado. Lo que él quiere es detectar en qué momento entra el puntero al icono (esto sí puede hacerse detectando el primer mensaje WM_MOUSEMOVE) y en qué momento sale (esto no veo cómo puede hacerlo directamente).

// Saludos
Responder Con Cita
  #9  
Antiguo 12-11-2008
byfali byfali is offline
Miembro
 
Registrado: Mar 2007
Posts: 24
Poder: 0
byfali Va por buen camino
Gracias a todos, lo intentare capturando las coordenadas del raton.
Ya os cuento.
Responder Con Cita
  #10  
Antiguo 12-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Como siempre tienes razón roman, por eso no he añadido nada.

¿hay posibilidad de cambiar el diseño?

Para mí, el hecho de pasar el ratón por ese área accidentalmente y que se muestre y oculte la ventana puede llegar a incomodarme mucho (por supuesto es mi opinión, tan válida como otra cualquiera).

Creo que lo más rápido de implementar y más cómodo, sería que al hacer clic con el botón izquierdo, se muestre el Form, con un timer se oculta pasados ¿5 segundos? y si el usuario hace clic encima del form pues que se oculte... o en fin, tú podrás hacer otra cosa.

También ten en cuenta que ese área está "sobre usada", todos los programas sacan mensajitos en ese área, quizás te interese buscar otra alternativa diferente.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.174
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por Lepe Ver Mensaje
Para mí, el hecho de pasar el ratón por ese área accidentalmente y que se muestre y oculte la ventana puede llegar a incomodarme mucho (por supuesto es mi opinión, tan válida como otra cualquiera).
Totalmente de acuerdo con esto. A veces las cosas que nos parecen "cool", resultan incómodas para el usuario. Aunque a veces es el usuario quien pide estas cosas.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TrayIcon y su Popup gluglu Varios 17 01-11-2011 21:36:37
TrayIcon y PopupMenu gluglu API de Windows 1 24-07-2008 00:19:43
TrayIcon en un servicio windows adrall API de Windows 2 19-03-2008 00:40:54
Trayicon mjjj Varios 2 21-09-2007 00:35:16
Problemas con TRAYICON!! marceloalegre Varios 3 07-06-2005 17:49:07


La franja horaria es GMT +2. Ahora son las 10:47:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi