系统托盘的老问题(50)

  • 主题发起人 主题发起人 ecjtuhr
  • 开始时间 开始时间
E

ecjtuhr

Unregistered / Unconfirmed
GUEST, unregistred user!
unit U_Frmenter;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActnList, ExtCtrls, ComCtrls, TabNotBk, Tabs, StdCtrls, Buttons, ShellAPI ,{jpeg,} Menus; const MY_MESSAGE = WM_USER + 30;{自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}type TFrmenter = class(TForm) Panhead: TPanel; //Imgjinghui: TImage; Labdengru: TLabel; Panbanquan: TPanel; //Imacopyright: TImage; Tabnbenter: TTabbedNotebook; Labusername: TLabel; Labpswd: TLabel; Edit1: TEdit; Edit2: TEdit; Bitbtnzhok: TBitBtn; Bitbtnzhcancel: TBitBtn; Label1: TLabel; Label2: TLabel; Edit3: TEdit; Edit4: TEdit; BitBtnzsok: TBitBtn; BitBtnzscancel: TBitBtn; Label3: TLabel; PopMsys: TPopupMenu; N1: TMenuItem; N2: TMenuItem; procedure FormActivate(Sender: TObject); procedure BitbtnzhcancelClick(Sender: TObject); procedure BitBtnzscancelClick(Sender: TObject); procedure OnIconNotify(var Message: TMessage); message MY_MESSAGE; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure N2Click(Sender: TObject); procedure N1Click(Sender: TObject); //procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean); //procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end;var Frmenter: TFrmenter; //winstate: boolean=false; nid:TNotifyIconData;implementation{$R *.dfm}{当主Form建立时通知Windows加入小图标}procedure TFrmenter.FormActivate(Sender: TObject);begin //-----------------------载入图片----------------------------------------------------------- {Imgjinghui.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '/pic/2.JPG'); Imacopyright.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'/pic/copyright.JPG');} //------------------------------------------------------------------------------------------ nid.cbSize := sizeof(nid); // nid变量的字节数 nid.Wnd := Handle; // 主窗口句柄 nid.uID := 0; // 内部标识,可设为任意数 nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指定 nid.szTip := '公安局人口信息管理'; // 提示字符串 nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息 nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有效 if not Shell_NotifyIcon(NIM_ADD, @nid) then begin ShowMessage('系统启动失败!'); Application.Terminate; end;[brown]SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);//加上这句可还是会在任务栏出现[/brown]end;//------------------------------------------//当小图标捕捉到鼠标事件时进入此过程procedure TFrmenter.OnIconNotify(var Message: TMessage);var pt:TPOINT ; begin if Message.Msg = MY_MESSAGE then begin //在通知消息中,wParam参数为图标的uID,lParam参数为鼠标事件的类型。 //获取鼠标的在屏幕上的位置 //通知消息的处理的基本框架结构如下: case Message.LParam of WM_RBUTTONDOWN: begin //鼠标右键被按下 [red]GetCursorPos(Pt); SetForeGroundWindow(Handle); //窗体上也能弹出菜单 PopMsys.Popup(pt.x, pt.y);[/red] end; WM_LBUTTONDBLCLK: begin //鼠标左键双击 //if not(Self.Visible) then //判断窗体是否缩小 //begin Application.Restore; Application.BringToFront ; //end; end; end; end; end;//------------------------------------------procedure TFrmenter.BitbtnzhcancelClick(Sender: TObject);beginShell_NotifyIcon(NIM_DELETE,@nid);close;end;procedure TFrmenter.FormClose(Sender: TObject; var Action: TCloseAction);begin Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标end;procedure TFrmenter.BitBtnzscancelClick(Sender: TObject);begin Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标 close;end;procedure TFrmenter.N2Click(Sender: TObject); //弹出菜单的关闭命令begin close;end;procedure TFrmenter.N1Click(Sender: TObject); //弹出菜单的显示命令begin Application.Restore; Application.BringToFront ;end;end.我用delphi试着做一个系统托盘的程序出现如下问题:1、我做一个登入窗体,当最小化后,任务栏仍然显示,而且在任务栏上面(右边“开始”上方悬着)还有,我想要的是跟QQ登入后只在系统栏中显示,请教怎么实现??2、我在系统托盘出点右键,可为什么在登入窗体上也能出现快捷菜单?我加了这句也不行,如红色部分,SetForeGroundWindow(nid.hIcon),为什么?3、登入窗体启动时,只在系统栏中显示(托盘处),不在任务栏中显示,我加了这句,SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW),如棕色部分,可任务栏还是有,问什么?
 
FormActivate代码转移到onCreate事件中。
 
我试了下,不行。
 
没有满意的答案,又不想给分,怎么办?
 
CoolTrayIcon控件能很好的解决系统托盘的问题。
 
给分w1: 代码上加上 visible:=false; w2: 加函数:procedure OnIconNotify(var Message: TMessage); message MY_MESSAGE;procedure TFormMain.OnIconNotify(var Message: TMessage);var p :tPoint; //任务栏图标激发事件begin busy:=false; if not Busy then begin Busy := True; if Message.LParam=WM_RBUTTONDOWN then //左键单击 begin GetCursorPos( p ); PpMenu.Popup(p.x ,p.y ); end ; if Message.LParam=WM_LBUTTONDBLCLK then //两下右键 begin Show; busy:=FALSE; end; Busy := False; end;end;w3:同w1 自己写代码是按了最小化 还是隐藏了!
 
全给你吧,虽然我早已经解决了,但你的回帖是不错的。
 

Similar threads

I
回复
0
查看
426
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部