Ikoni tarjottimelle

gebbiz 01.08.01 10:26

Lisää ohjelman ikonin windowsin alapalkkiin kellonviereen jota klikkaamalla oikealla napilla tulee popupmenu ja poistaa ohjelman tehtäväpalkilta.

 Tekstiversio  Arvo: 2 (2 ääntä)  Äänestä: +  -
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ShellAPI, Menus;

const
  WM_TRAYICON = WM_USER+1;

type
  TMainForm = class(TForm)
    TrayMenu: TPopupMenu;
    miClose: TMenuItem;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure miCloseClick(Sender: TObject);
  private
    Starting: Boolean;
    NIData: TNotifyIconData;
  public
    procedure IconCallBackMessage(var Msg: TMessage); message WM_TRAYICON;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.FormPaint(Sender: TObject);
begin
 if Starting then begin
  Starting:=False;
  ShowWindow(Application.Handle, SW_HIDE);
 end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 Starting:=True;
 with NIData do begin
  cbSize:=sizeof(NIData);
  Wnd:=Self.handle;
  uID:=1;
  uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
  hIcon:=Application.Icon.Handle;
  szTip:='Ohjelman nimi';
  uCallBackMessage:=WM_TRAYICON;
 end;
 Shell_NotifyIcon(NIM_ADD,@NIData);
end;

procedure TMainForm.IconCallBackMessage(var Msg: TMessage);
var MousePos: Tpoint;
begin
 case Msg.lParam of
  WM_LBUTTONDOWN: SetForegroundWindow(Application.Handle);
  WM_RBUTTONDOWN: begin
   GetCursorPos(MousePos);
   SetForegroundWindow(Application.Handle);
   Application.ProcessMessages;
   TrayMenu.Popup(MousePos.X,MousePos.Y);
  end;
 end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 Shell_NotifyIcon(NIM_DELETE,@NIData);
end;

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

end.

raimo 10:36 9.10.02 
Sempä verran tuohon, että jotta ikoni katoaisi varmasti,
Shell_NotifyIcon(NIM_DELETE,@NIData);
pitää olla Formin OnDestroy -käsittelijässä, eikä suinkaan
OnClose.

raimo 12:17 9.10.02 
Ja lisäämpä vieläkin :) Vaihtuva "hinttitippi" Tray-ikoniin kun lisäämmä case Msg.lParam of perään:

WM_MOUSEMOVE:
begin
StrPLCopy(NIData.szTip, PChar(TimeToStr(Time)), SizeOf(NIData.szTip));
Shell_NotifyIcon(NIM_MODIFY,@NIData);
end;

Tuossa ikoniin ilmestyy kellonaika. Ajastimella saa jopa käymään sen kellon...
gebbiz 20:33 14.10.02 
jepjep. OnDestroyiin tosiaan ilman muuta. Ton NotifyIconDatankin vois varmaan sijoittaa vaikka formiin eikä globaaliks (elegantimpaa?). Tuo OnPaintin käyttö tuossa tuntuu myös aika hölmöltä, mutta ei se tunnu muuten piiloutuvan tehtäväpalkilta.
empty 18:50 3.12.02 
Joo, hyvä ja muuten vois muokata koodinpätkän niin että se näyttää ballon-hinttippi ikkunan (XP, ME)
raimo 18:20 25.1.03 
Ai niin, tämäkin on kiva :)
Jos haluaa että ohjelma käynnistyy suoraan Taskbaariin, ts ohjelma ei vilahdakkaan näytössä vaan menee kuvakkeeksi suoraan, niin:
ProjectSourceen (View - Project source)

Application.ShowMainForm:= False;

Laita tuo rivi Application.Initialize; rivin jälkeen.