Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Saber la posicion de tu aplicacion en el Systray (https://www.clubdelphi.com/foros/showthread.php?t=37962)

kloud 28-11-2006 00:57:05

Saber la posicion de tu aplicacion en el Systray
 
Hola, como sabran podemos mover la barra de tareas (taskbar) y ponerla donde queramos. Esto me supone un problema, xk necesito saber la posicion exacta de el icono que colocare en el systray de mi aplicacion para poder mostrar una ventana (como el MSN cuando alguien se conecta o te habla).
Espero vuestra ayuda. Un saludo.

roman 28-11-2006 01:36:27

Colocar la ventana relativa a la posición exacta del icono, aunque supongo que se puede hacer, se me hace un poco excesivo. Yo la colocaría simplemente de acuerdo la posición de la barra de tareas (ésta determina la equina donde se encuentra el área de iconos) y eso lo puedes hacer así:

Código Delphi [-]
uses  ShellApi;

...

var
  AppBarData: TAppBarData;

begin
  AppBarData.cbSize := SizeOf(AppBarData);
  AppBarData.hWnd := 0;

  SHAppBarMessage(ABM_GETTASKBARPOS, AppBarData);
  case AppBarData.uEdge of
    ABE_BOTTOM: ShowMessage('abajo');
    ABE_LEFT: ShowMessage('izquierda');
    ABE_TOP: ShowMessage('arriba');
    ABE_RIGHT: ShowMessage('derecha');
  end;
end;

// Saludos

seoane 28-11-2006 01:43:04

Bueno como dijo el ilustre señor Esperalta "ratón que conoce un agujero sólo pronto le caza el gato", así que vamos a ver cuantos agujeros encontramos.

La primera solución podría ser obtener las coordenadas del propio systray:
Código Delphi [-]
function GetSysTrayRect(var R: TRect): Boolean;
var
  hWnd: THandle;
begin
  Result:= FALSE;
  hWnd:= FindWindow('Shell_TrayWnd',nil);
  if hWnd <> 0 then
  begin
    hWnd:= FindWindowEx(hWnd,0,'TrayNotifyWnd',nil);
    if hWnd <> 0 then
      Result:= GetWindowRect(hWnd,R);
  end;
end;

O incluso si queremos dejar aparte el área destinada al reloj y solo obtener la destinada a los iconos, podemos afinar un poco más el código:
Código Delphi [-]
function GetSysTrayRect(var R: TRect): Boolean;
var
  hWnd: THandle;
begin
  Result:= FALSE;
  hWnd:= FindWindow('Shell_TrayWnd',nil);
  if hWnd <> 0 then
  begin
    hWnd:= FindWindowEx(hWnd,0,'TrayNotifyWnd',nil);
    begin
      hWnd:= FindWindowEx(hWnd,0,'SysPager',nil);
      if hWnd <> 0 then
      begin
        hWnd:= FindWindowEx(hWnd,0,'ToolbarWindow32',nil);
        if hWnd <> 0 then
          Result:= GetWindowRect(hWnd,R);
      end;
    end;
  end;
end;

Un ejemplo de las dos funciones anteriores seria el siguiente:
Código Delphi [-]
var
  R: TRect;
begin
  if GetSysTrayRect(R) then
    ShowMessage(Format('Top=%d Left=%d Bottom=%d Right=%d',
      [R.Top,R.Left,R.Bottom,R.Right]));
end;

Pero ahora que tenemos las coordenadas de la bandeja del sistema, pienso que en realidad no te hace falta para nada :p . Porque lo realmente bonito son esos globitos amarillos que muestran algunos iconos para notificar algo, seguro que los has visto alguna vez. Y para mostrarlos solo hay que usar un par de funciones de la API y ellas se encargan de todo el trabajo. ¿que opinas?

roman 28-11-2006 03:41:08

1 Archivos Adjunto(s)
Adjunto un pequeño ejemplo de un formulario que ya tiene interconstruido el comportamiento animado y ajustado a la esquina que corresponda según la orilla del monitor donde se encuentre la barra de tareas. Para mostrarla ya sólo hay que usar su método Show o poner su propiedad Visible en true.

En el zip se encuentra un ejecutable pero éste sólo se puede usar si se tiene instalado Delphi 7, si no es así, basta compilarlo.

// Saludos

seoane 28-11-2006 04:05:09

Ahora que veo el código de roman, creo que entendí mal lo que buscaba kloud. Aunque sigo diciendo que los globitos son una manera muy "bonita" de mostrar notificaciones.

Y solo por molestar ;) , en donde usas, por ejemplo
Código Delphi [-]
Top := Screen.Height - Height - TaskBarSize.cy + GetSystemMetrics(SM_CYEDGE);

No podríamos usar:
Código Delphi [-]
Top:=  Screen.WorkAreaHeight - Height;

roman 28-11-2006 06:12:15

De hecho es lo primero que pensé pero no estoy muy seguro porque me imagino que esas ventanas de notificación suelen salir pegadas a la barra de tareas. Si usamos WorkAreaRect y hay más barras de aplicación, puede ser que la ventana ya no quede pegada a la barra de tareas.

// Saludos


La franja horaria es GMT +2. Ahora son las 01:40:59.

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