托盘的老问题,图标、句柄...(50分)

  • 主题发起人 主题发起人 delphi200808
  • 开始时间 开始时间
D

delphi200808

Unregistered / Unconfirmed
GUEST, unregistred user!
关于取托盘信息的贴子讨论了很多,但好象没有一个真正解决了的,大富翁讨论了几年也没有结果,知道的人不愿意告诉,要共享软件挣钱呢,但这些软件一般也就是隐藏个托盘图标。今天看到一个软件,不但取到了托盘的图标,还能像Windows托盘一样处理消息,这个软件有自己的托盘区,加载了所有Windows的托盘图标,比如,在它的QQ图标上点左右键与在Windows的托盘图标上点是同样的,而且QQ的弹出菜单会与它的托盘位置对齐,我想,它应该是得到了Shell_NotifyIcon中几个最重要的参数:hWnd,uID,uCallbackMessage,hIcon,szTip。然后自己向对应的窗口发消息,所以才会有这样的效果。关于取托盘显示文字可以通过TB_GETBUTTONTEXT得到,但其它几个参数如何得到呢,TBBUTTON数据结构中根本就没有其它参数啊。特别是hWnd,uID,uCallbackMessage这三个参数,是从哪得来的呢?难道是钩子,钩住了API,但好象不光是,因为它启动之前,托盘已经有图标了,但它照样能得到。

知道不知道,大家都来讨论一下。
图标的问题,基本上有思路,关键是hWnd,uID,uCallbackMessage这三个参数。
 
const
WM_TrayMessage = WM_User + 100;

public
{ Public declarations }
procedure WMTrayMessage(var msg: TMessage); message WM_TrayMessage;

var
NID: TNotifyIconData;
begin
form1.Hide;
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)
end;


procedure TForm1.WMTrayMessage(var msg: TMessage);
var
p: TPoint;
begin
if msg.LParam = WM_LButtonDown then
begin
MessageDlg('呵呵', mtInformation, [mbOK], 0);
end
else if msg.LParam = WM_RButtonDown then
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x, p.y);
end;
end;
 
楼上的没有明白我的意思,我不是说如何建立托盘和使用托盘,是如何控制托盘区的其它托盘,一个是取托盘区的其它托盘图标,这个应该没问题,都有对应的消息与函数可以实现,但问题是如何取使用Shell_NotifyIcon建立托盘时的三个关键参数:hWnd,uID,uCallbackMessage。如果说这三个参数取不到,但为什么那个软件能给我的程序发消息。而且完全正确呢?但如果能取到,又是怎么取到的呢?好象没有什么API能实现这个功能啊。
 
顶一顶。
 
再顶顶。怎么就没人会呢,我只需要说说思路就行,现在是没思路啊。
 
楼主取托盘区的图标怎么取啊?你能给点代码吗? 谢谢!!
 
拖盘图标很简单的,就是二个消息TB_GetButton,TB_GETIMAGELIST加一个函数ImageList_GetIcon,TB_GetButton得到按纽的图标索引值,TB_Getimagelist得到图标列表的句柄,然后把这二个值传给函数,就得到新图标句柄了。不过,注意的一点就是,TB_GetImagelist可以指定窗口句柄,因此可以执行在任何进程中,而TB_GetButton与函数,都是指对当前进程而言,所以代码必须执行在Explorer进程中,也就是要先注入进程,然后让代码执行,至于注入进程,方法很多了,自己找找吧。至于用hook还是自定义的消息触发,自己随便了。那个软件应该是用的Hook。只有二个文件,一个是主程序文件,一个是叫TrayHook.dll的文件,肯定是Hook文件。
 
哎,最后顶一下啊,没人知道就结贴了,哎。
 
哎,真的是没什么高手了。
 
后退
顶部