我参照一些文章自己做了个系统托盘的程序,但是有几个小问题想请教一下各位高手
1.程序结束后也释放了图标,但图标不会自动从任务栏上消失,非要鼠标移动到那里一下。
2.我的程序在处理数据,点右键,菜单很久才会出来,而且又要很久才能选择,怎样解决?
3.点右键弹出菜单后若不进行选择,那么点菜单以外的任何地方,菜单不会自动消失,真是困惑。
高手指点一下,先谢过了。
1.程序结束后也释放了图标,但图标不会自动从任务栏上消失,非要鼠标移动到那里一下。
2.我的程序在处理数据,点右键,菜单很久才会出来,而且又要很久才能选择,怎样解决?
3.点右键弹出菜单后若不进行选择,那么点菜单以外的任何地方,菜单不会自动消失,真是困惑。
高手指点一下,先谢过了。
第二项不清楚。
第三项是应该属于热点更替的问题吧。本人水平有限,请更多高手指点指点。
http://community.csdn.net/Expert/topic/3436/3436573.xml?http://community.csdn.net/Expert/topic/3205/3205536.xml?temp=.5616114
请确认你释放了,检查API的返回值,有可能参数不对没正确释放.2.我的程序在处理数据,点右键,菜单很久才会出来,而且又要很久才能选择,怎样解决?
换一台快点的机器.或把你处理数据的部分写到另外一个线程,把该线程的优先度调低.3.点右键弹出菜单后若不进行选择,那么点菜单以外的任何地方,菜单不会自动消失,真是困惑。
弹出菜单之前,把该菜单的Form置为前端窗口,这个问题问烂了,一搜一大堆.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, Menus;
const
WM_TrayMessage=WM_User+100;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N11: TMenuItem;
N21: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
procedure AppMinimized(Sender: TObject);
procedure WMTrayMessage(var msg:TMessage);message WM_TrayMessage;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
NID:TNotifyIconData;
implementation{$R *.dfm}
procedure TForm1.AppMinimized(Sender: TObject);
begin
NID.cbSize:=SizeOf(TNotifyIconData);
NID.hIcon:=Application.Icon.Handle;
NID.szTip:= '工程一 ';
NID.uCallbackMessage:=WM_TrayMessage;
NID.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
NID.uID:=0;
NID.Wnd:=Handle;
Shell_NotifyIcon(NIM_ADD,@NID);
ShowWindow(Application.Handle,SW_Hide);
end;
procedure TForm1.WMTrayMessage(var msg: TMessage);
var
p:TPoint;
begin
if msg.LParam=WM_LButtonDown then
begin
ShowWindow(Application.Handle,SW_Show);
Application.Restore;
end
else if msg.LParam=WM_RButtonDown then
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x,p.y);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize:=AppMinimized;
AppMinimized(nil);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NID);
end;end.
单独创建一个托盘程序看看有没有错,如果没有的话,下一步,看看是哪错了。真正的错误 ,如果是托盘的问题,说明是这段代码了,网上有很多托盘例子都不错。排除一下吧!OK!看一下这个原来的问题:
程序退出后在任务栏中留下一个空格,点一下才消失 :
要解决这个问题,首先得找原因,造成这个问题,是因为Form的 WindowState= wsMaximized,而且 Form的BorderIcons 中没有 biMaximize 属性。如果From的BorderStyle的属性是bsNone,只在BorderIcons中添加biMaximize还不能解决问题,必须得设置From的BorderStyle的属性不为bsNone,比如说,是bsSingel等,为此可以有以下解决办法: procedure TForm1.FormCloseQuery(Sender: TObject;var CanClose: Boolean);
begin
Form1.BorderIcons :=Form1.BorderIcons + [biMaximize];
Form1.BorderStyle := bsSingle ;
end;是不是有此类的原因呢?窗体设计的有没有问题,祝你成功了