大家进来看看,我做了一个托盘的程序,可是有点儿小问题,请教大家。(100分)

I

Imfish

Unregistered / Unconfirmed
GUEST, unregistred user!
系统启动后就让该程序自动执行并出现在托盘中
问题1:执行时总是闪动出现主窗体,不能直接出现在
托盘中,怎样解决?
备注:主窗体中只有一个弹出菜单,能删除主窗体吗?
问题2:退出程序时,不能马上删除掉托盘图标,非得鼠标在上面晃一下,才消失,怎样解决?
下面是我的代码
procedure Tmainform.FormCreate(Sender: TObject);
begin
//建立托盘图标
TrayIconData.cbSize := sizeof(TrayIconData); //TrayIconData变量的字节数
TrayIconData.Wnd := Handle; //主窗口句柄
TrayIconData.uID := 1; //内部标识,可设为任意数
TrayIconData.hIcon := Icon.Handle;
{要加入的图标句柄,可任意指定,此处为在Tform中Icon属性中指定的图标
TrayIconData.hIcon := Application.Icon.Handle;
此句使用了程序的图标,和上句程序有区别,下句亦可,但推荐使用上句,这样图标加
入到托盘中时图标不会走样。}
TrayIconData.hIcon := LoadIcon(0,IDI_APPLICATION);
TrayIconData.szTip := '正在运行-//轨道衡客户端';//图标的提示信息,即黄色的Hint
TrayIconData.uCallbackMessage := MYTRAY_MESSAGE;
TrayIconData.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; //指明哪些字段有效
{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Shell_NotifyIcon(NIM_ADD, @TrayIconData); //向托盘中添加图标
end;

procedure Tmainform.POPEXITClick(Sender: TObject);
begin//弹出菜单事件
Application.Terminate;
end;

procedure Tmainform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TrayIconData.cbSize := sizeof(TrayIconData); //TrayIconData变量的字节数
TrayIconData.uID := 1; //内部标识,与加入小图标时的数一致
TrayIconData.Wnd := Handle; //主窗口句柄
//TrayIconData.uFlags := 0;
Shell_NotifyIcon(NIM_DELETE, @TrayIconData); //去掉小图标
end;

procedure Tmainform.FormPaint(Sender: TObject);
begin
Hide;
end;

procedure TMainForm.MyTrayMessage(var message: Tmessage);
var //托盘消息处理事件
CursorPos : TPoint;
begin
//在这里处理用户点击托盘图标事件,可以根据WM_MOUSEMOVE消息的不同情况产生不同的
//回应,例如区别对待单击和双击等等
case message.lParam of
//
//WM_LBUTTONDOWN :
//mcisendstring( pchar(cdromStatus),nil,0,handle);
//if not Busy then begin

//ShowWindow(Handle, SW_SHOW );

WM_RBUTTONDOWN :
begin
GetCursorPos(CursorPos);
SetForegroundWindow(handle);
//此句作用是当程序失去焦点时,弹出菜单也随之消失。
Application.ProcessMessages;
//取得光标当前位置
TrayPopMenu.Popup( CursorPos.x ,CursorPos.y );
PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;
end;
end;

procedure Tmainform.POPSetClick(Sender: TObject);
begin
setform.showmodal;
end;
end.
 
在工程文件中加入:
Application.ShowMainForm := False;
即可。
 
答1:beta已经说了。呵呵
答2:
procedure Tmainform.POPEXITClick(Sender: TObject);
begin//弹出菜单事件
//加入删除
Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
Application.Terminate;
end;
 
procedure Tmainform.POPEXITClick(Sender: TObject);
begin//弹出菜单事件
Application.Terminate;
end;
别用Terminate,用Close;


procedure Tmainform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TrayIconData.cbSize := sizeof(TrayIconData); //TrayIconData变量的字节数
TrayIconData.uID := 1; //内部标识,与加入小图标时的数一致
TrayIconData.Wnd := Handle; //主窗口句柄
//TrayIconData.uFlags := 0;
Shell_NotifyIcon(NIM_DELETE, @TrayIconData); //去掉小图标
end;
前面三步不用。
 
各位真是高手,向你们学习,给你们加分
 
顶部