如何实现在右击托盘里的图标时弹出popu menu. 不好意识写错了。应该popup menu 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在自带的例子中查找TrayIcon 建立窗体Form1,在Form1中放置一个tPoputMenu组件,设置Form1的BorderStyle为bsNone这里要用到windows API函数Shell_NotifyIcon,所以在uses中添加shellapi单元unit unit1;...uses windoww,messags,....,shellapi;const ICON_ID=1; MI_ICONEVENT = WM_USER + 1;type TForm1 = class(TForm)..... private Icon : TIcon; Procedure InstallIcon; Procedure IconOnClick(Var Message : TMessage );message MI_ICONEVENT; public....procedure TForm1.InstallIcon;var IconData : TNotifyIconData;begin Icon := TIcon.Create; Icon.LoadFromFile('icon.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 := Icon.Handle; IconData.szTip := 'one icon example'; Shell_NotifyIcon(NIM_ADD,@IconData);end;procedure TForm1.IconOnClick(var message : TMessage);var p : TPoint;begin if (message.IParam = WM_RBUTTONDOWN) then //如果按下的是右键 begin GetCursorPos(p); PopupMenu1.Poput(p.x,p.y); end;end; procedure TForm1.FormCreate(Sender : TObject);begin Status := True; InstallIcon; showWindow(Application,handle,SW_HIDE); setWindowLong(Appliction,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);end;procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);var Icondata : TNOtifyIConData;begin Icondata.cbSize := SizeOf(Icondata); Icondata.Wnd := Handle; IconData.uID := ICON_ID; Shell_NOtifyIcon(NIM_DELETE,@IconData); Icon.Free;end;PopupMenu1的时间就跟一般的一样还有Shell_NotifyIcon是用来向状态指示区发消息的,它的函数原型是function Shell_NotifyIcon(dwMessage : DWORD;LpData ; PNotifyIconData):Bool;stdcall;其中LpData是指向TNotifyIconData结构的指针,此结构是要增加的图标的信息PNotifyIconData =^TNotifyIconDataTNotifyIconData = record cbSize : DWORD; Wnd : HWND; uID : UINT; uFlags : UINT; uCallbackMessage : UINT; hIcon : HICON; szTip : array [0..63] of AnsiChar;end; popup menu是出来了,可你点其他地方的时候他不消失,一直显示,除非你选其中的一项。这可叫我如何是好。 这个问题也是我所碰到并无法解决的,请大家一并看一下这个帖子吧:http://www.csdn.net/expert/TopicView.asp?id=248953TO:bb_star_bb(爱编程的菜鸟),如果不是点击窗体呢?比如说点击了桌面空白处或者别的程序的界面,那怎么办?你的方法不就不行了?!我不想使用控件,我想自己编写代码,主要是想了解一下原理! 我搜了一把,确实找到了一些帖子。http://www.csdn.net/expert/Topic/132/132764.shtm大家有兴趣去看看吧! 我已经解决了,xuejinlong(垃圾) 你解决了吗?可参考http://www.csdn.net/expert/Topic/132/132764.shtmhttp://www.csdn.net/expert/TopicView.asp?id=248953 setwindows函数怎么使用? 考试期间室友居然不睡觉 怎样用delphi+mysql插入不确定具体数目的记录 看似简单~~关于DateTimePicker 控件的字体设置问题﹐其实挺难 在DBGrid中如何显示Memo字段值? 如何判断2000/xp的用户类型。 异常处理为什么失灵了? 请教各位一个简单的问题(散分) 修改Table数据时出现'Record/key deleted' 第一次学习Delphi,从零开始,希望各位师兄多多指教! 声名变量的问题 如何使弹出的 PopupMenu 消失?
TrayIcon
这里要用到windows API函数Shell_NotifyIcon,所以在uses中添加shellapi单元unit unit1;
...
uses
windoww,messags,....,shellapi;
const
ICON_ID=1;
MI_ICONEVENT = WM_USER + 1;
type
TForm1 = class(TForm)
.....
private
Icon : TIcon;
Procedure InstallIcon;
Procedure IconOnClick(Var Message : TMessage );message MI_ICONEVENT;
public
....procedure TForm1.InstallIcon;
var
IconData : TNotifyIconData;
begin
Icon := TIcon.Create;
Icon.LoadFromFile('icon.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 := Icon.Handle;
IconData.szTip := 'one icon example';
Shell_NotifyIcon(NIM_ADD,@IconData);
end;procedure TForm1.IconOnClick(var message : TMessage);
var
p : TPoint;
begin
if (message.IParam = WM_RBUTTONDOWN) then //如果按下的是右键
begin
GetCursorPos(p);
PopupMenu1.Poput(p.x,p.y);
end;
end; procedure TForm1.FormCreate(Sender : TObject);
begin
Status := True;
InstallIcon;
showWindow(Application,handle,SW_HIDE);
setWindowLong(Appliction,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
var
Icondata : TNOtifyIConData;
begin
Icondata.cbSize := SizeOf(Icondata);
Icondata.Wnd := Handle;
IconData.uID := ICON_ID;
Shell_NOtifyIcon(NIM_DELETE,@IconData);
Icon.Free;
end;PopupMenu1的时间就跟一般的一样还有Shell_NotifyIcon是用来向状态指示区发消息的,它的函数原型是
function Shell_NotifyIcon(dwMessage : DWORD;LpData ; PNotifyIconData):Bool;stdcall;
其中LpData是指向TNotifyIconData结构的指针,此结构是要增加的图标的信息
PNotifyIconData =^TNotifyIconData
TNotifyIconData = record
cbSize : DWORD;
Wnd : HWND;
uID : UINT;
uFlags : UINT;
uCallbackMessage : UINT;
hIcon : HICON;
szTip : array [0..63] of AnsiChar;
end;
这可叫我如何是好。
http://www.csdn.net/expert/TopicView.asp?id=248953TO:bb_star_bb(爱编程的菜鸟),如果不是点击窗体呢?比如说点击了桌面空白处或者别的程序的界面,那怎么办?你的方法不就不行了?!我不想使用控件,我想自己编写代码,主要是想了解一下原理!
http://www.csdn.net/expert/Topic/132/132764.shtm
大家有兴趣去看看吧!
可参考http://www.csdn.net/expert/Topic/132/132764.shtm
http://www.csdn.net/expert/TopicView.asp?id=248953