谢谢各位。但出了点问题,这是我的代码://在状态区添加图标function TServMainForm.AddIcon(hwnd: HWND): Boolean; begin nid.cbSize := sizeof(NOTIFYICONDATA); nid.Wnd := hwnd; nid.uID := ID_MAIN; nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; nid.uCallbackMessage := WM_YXSFNOTIFY; nid.hIcon := LoadIcon(hInstance, 'MAINICON'); strCopy(nid.szTip, strNotifyTip); AddIcon := Shell_NotifyIcon(NIM_ADD, @nid); end;//从状态区移去图标function TServMainForm.RemoveIcon(hwnd: HWND): Boolean; var nid: NOTIFYICONDATA; begin nid.cbSize := sizeof(NOTIFYICONDATA); nid.Wnd := hwnd; nid.uID := ID_MAIN; nid.uFlags := 0; RemoveIcon := Shell_NotifyIcon(NIM_DELETE, @nid); end;//拦截关闭消息: procedure TServMainForm.WMSysCommand(var msg: TMessage); begin if Msg.WParam = SC_CLOSE then begin ServMainForm.Hide ; Application.MainForm.Visible:=false; AddIcon(handle); ShowWindow(Application.handle, sw_hide) end else Inherited;从托盘区恢复窗口时,我使用了:procedure TServMainForm.FormRestorClick(Sender: TObject); begin RemoveIcon(handle); ShowWindow(Application.handle, SW_SHOWNORMAL); end;但结果却是只到了任务栏,窗口并没有恢复。这是为何?
想显示窗体时 写下如下代码就行 时间有限不作解释有不明白的可以发消息给我 ShowWindow(Handle, SW_SHOW); ShowWindow(Application.handle, SW_SHOW);SetWindowLong(Application.Handle, GWL_EXSTYLE,not (GetWindowLong(Application.handle, GWL_EXSTYLE)or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW)); SetForegroundWindow(Application.Handle);
procedure TForm1.WMSysCommand(var msg: TMessage); begin if (msg.WParam=SC_CLOSE) then begin application.minimize; MainForm.Visible:=false; end else Inherited; end;
To duxin(小伍)这个方法可行,但仅限于第一次。和我以上的代码结合到一起时,在第二倒第三词最小化和恢复时,不能正常最小化。主界面不能隐藏。
//把窗体隐藏,再隐藏任务栏: Form_main.Visible:=false; ShowWindow(handle,SW_HIDE);//隐藏工具栏 //装载托盘图标: myicon:=ticon.Create; myicon.LoadFromFile('File\ico.ico'); icondata.cbSize:=sizeof(icondata); icondata.Wnd:=handle; icondata.uID:=ICON_ID; icondata.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP; icondata.uCallbackMessage:=MI_ICONEVENT; icondata.hIcon:=myicon.Handle; icondata.szTip:='福思特软件-客户管理系统'; Shell_NotifyIcon(NIM_ADD,@icondata);
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.uID := 0; //内部标识,与加入小图标时的数一致
nid.Wnd := Handle; //主窗口句柄
Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标
Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标
end;//本过程在这里只隐藏界面功能
procedure TForm1.FormActivate(Sender: TObject);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.Wnd := Handle; // 主窗口句柄
nid.uID := 0; // 内部标识,可设为任意数
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指?
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指? nid.szTip := '程序V1.2'; // 提示字符串
nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息
nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有? if not Shell_NotifyIcon(NIM_ADD, @nid) then
begin
ShowMessage('Failed!');
Application.Terminate;
end;
{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
//SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;procedure TForm1.OnIconNotify(var Message: TMessage);
Var
Busy:Boolean;
begin
Busy:= false;
if not Busy then
begin
Busy:= true;
if Message.LParam=WM_LBUTTONDOWN then
//恢复
show;
Busy := false;
end;
end;
声明过程
Procedure WMSysCommand(Var msg : TMessage);Message WM_SYSCOMMAND ;
过程实例
procedure TFormMain.WMSysCommand(var msg: TMessage);
begin
case Msg.WParam of
SC_MINIMIZE: begin //最小化
end;
SC_CLOSE :begin
FormMain.Hide ;
Application.MainForm.Visible:=false;
end;
end;
Inherited;
end;
http://www.8860.net/delphicode/dispdoc.asp?id=64
begin
nid.cbSize := sizeof(NOTIFYICONDATA);
nid.Wnd := hwnd;
nid.uID := ID_MAIN;
nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
nid.uCallbackMessage := WM_YXSFNOTIFY;
nid.hIcon := LoadIcon(hInstance, 'MAINICON');
strCopy(nid.szTip, strNotifyTip);
AddIcon := Shell_NotifyIcon(NIM_ADD, @nid);
end;//从状态区移去图标function TServMainForm.RemoveIcon(hwnd: HWND): Boolean;
var
nid: NOTIFYICONDATA;
begin
nid.cbSize := sizeof(NOTIFYICONDATA);
nid.Wnd := hwnd;
nid.uID := ID_MAIN;
nid.uFlags := 0;
RemoveIcon := Shell_NotifyIcon(NIM_DELETE, @nid);
end;//拦截关闭消息:
procedure TServMainForm.WMSysCommand(var msg: TMessage);
begin
if Msg.WParam = SC_CLOSE then
begin
ServMainForm.Hide ;
Application.MainForm.Visible:=false;
AddIcon(handle);
ShowWindow(Application.handle, sw_hide)
end
else
Inherited;从托盘区恢复窗口时,我使用了:procedure TServMainForm.FormRestorClick(Sender: TObject);
begin
RemoveIcon(handle);
ShowWindow(Application.handle, SW_SHOWNORMAL);
end;但结果却是只到了任务栏,窗口并没有恢复。这是为何?
ShowWindow(Handle, SW_SHOW);
ShowWindow(Application.handle, SW_SHOW);SetWindowLong(Application.Handle, GWL_EXSTYLE,not (GetWindowLong(Application.handle, GWL_EXSTYLE)or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));
SetForegroundWindow(Application.Handle);
begin
if (msg.WParam=SC_CLOSE) then
begin
application.minimize;
MainForm.Visible:=false;
end
else
Inherited;
end;
Form_main.Visible:=false;
ShowWindow(handle,SW_HIDE);//隐藏工具栏
//装载托盘图标:
myicon:=ticon.Create;
myicon.LoadFromFile('File\ico.ico');
icondata.cbSize:=sizeof(icondata);
icondata.Wnd:=handle;
icondata.uID:=ICON_ID;
icondata.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
icondata.uCallbackMessage:=MI_ICONEVENT;
icondata.hIcon:=myicon.Handle;
icondata.szTip:='福思特软件-客户管理系统';
Shell_NotifyIcon(NIM_ADD,@icondata);