unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, shellapi, Menus, ExtCtrls; const TrayIconID = 1; CM_TRAYICON=WM_USER+1001; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; Timer1: TTimer; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure N1Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private FIcon: TIcon; Flag: Boolean; nid: TNotifyIconData; procedure MessageHandler(var msg: TMessage); message CM_TRAYICON; { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin FIcon := TIcon.Create; FIcon.Handle := LoadIcon(HInstance, 'MainIcon' ); if FIcon.Handle = 0 then begin MessageDlg('无法打开图标!', mtError, [mbok], 0); Application.Terminate; exit; end; with nid do begin cbSize := sizeof(TNotifyIconData); Wnd := Handle; uID := TrayIconID; uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; uCallbackMessage := CM_TRAYICON; hIcon := FIcon.Handle; StrPCopy(szTip, '这是一个测试程序!') end; Shell_NotifyIcon(NIM_ADD, @nid); SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Shell_NotifyIcon(NIM_DELETE, @nid); FIcon.Free; end;procedure TForm1.N1Click(Sender: TObject); begin MessageDlg('这是一个测试程序!', mtInformation, [mbOK], 0); end;procedure TForm1.N2Click(Sender: TObject); begin close; end;procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; if Flag = false then if Visible then Hide else Show; end;procedure Tform1.MessageHandler(var msg: TMessage); var Point: TPoint; begin if msg.WParam = TrayIconID then case msg.LParam of WM_LBUTTONDOWN: begin with Timer1 do begin Enabled := true; Interval := GetDoubleClickTime; end; end; WM_LBUTTONDBLCLK: begin Flag := true; MessageDlg('这是一个测试程序!', mtInformation, [mbok], 0); Flag := false; end; WM_RBUTTONDOWN: begin GetCursorPos(Point); PopupMenu1.Popup(Point.X, Point.Y); end; end; end;end.如果要控制就加一个全局控制变量就好了
shell_notifyicona(NIM_ADD,@popm);//这是一个win api 函数,用于添加托盘图标,具体用法可查帮助 Form1.Hide;//隐藏窗体 ShowWindow(Application.Handle,SW_HIDE);//隐藏任务栏图标 //如此就可以了
showwindow(application.Handle,sw_Hide); //设置窗口为隐藏状态 //改变窗体的 GWL_EXSTYLE 属性 setwindowlong(application.Handle,GWL_EXSTYLE, getwindowlong(application.Handle,GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
再加上1楼那句就OK了,或者自己用代码实现托盘图标
就是在程序运行时不在任务栏显示,只在托盘区显示图标,就像千千静听一样。一楼的语句我试了,程序没反应。
代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.ShowMainForm:=False;
end;
我已经加上了那个RZTrayIcon。
ShowWindow(Application.Handle, SW_HIDE);
直接用主窗体会有些问题
比较好的办法是主窗体空在那里, 就一个白的就可以按楼上办法, OnCreate 中写到Application.ShowMainForm:=False;
// 这里另建一个窗口作界面
xxxForm := TxxxForm.Create(Self);
xxxForm.Show;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shellapi, Menus, ExtCtrls;
const
TrayIconID = 1;
CM_TRAYICON=WM_USER+1001;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Timer1: TTimer;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FIcon: TIcon;
Flag: Boolean;
nid: TNotifyIconData;
procedure MessageHandler(var msg: TMessage); message CM_TRAYICON;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
FIcon := TIcon.Create;
FIcon.Handle := LoadIcon(HInstance, 'MainIcon' );
if FIcon.Handle = 0 then
begin
MessageDlg('无法打开图标!', mtError, [mbok], 0);
Application.Terminate;
exit;
end; with nid do
begin
cbSize := sizeof(TNotifyIconData);
Wnd := Handle;
uID := TrayIconID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CM_TRAYICON;
hIcon := FIcon.Handle;
StrPCopy(szTip, '这是一个测试程序!')
end;
Shell_NotifyIcon(NIM_ADD, @nid);
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon(NIM_DELETE, @nid);
FIcon.Free;
end;procedure TForm1.N1Click(Sender: TObject);
begin
MessageDlg('这是一个测试程序!', mtInformation, [mbOK], 0);
end;procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
if Flag = false then
if Visible then
Hide
else
Show;
end;procedure Tform1.MessageHandler(var msg: TMessage);
var
Point: TPoint;
begin
if msg.WParam = TrayIconID then
case msg.LParam of
WM_LBUTTONDOWN:
begin
with Timer1 do
begin
Enabled := true;
Interval := GetDoubleClickTime;
end;
end;
WM_LBUTTONDBLCLK:
begin
Flag := true;
MessageDlg('这是一个测试程序!', mtInformation, [mbok], 0);
Flag := false;
end;
WM_RBUTTONDOWN:
begin
GetCursorPos(Point);
PopupMenu1.Popup(Point.X, Point.Y);
end;
end;
end;end.如果要控制就加一个全局控制变量就好了
Form1.Hide;//隐藏窗体
ShowWindow(Application.Handle,SW_HIDE);//隐藏任务栏图标
//如此就可以了
//改变窗体的 GWL_EXSTYLE 属性
setwindowlong(application.Handle,GWL_EXSTYLE,
getwindowlong(application.Handle,GWL_EXSTYLE)
or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);