您的位置:首页 > 编程语言 > Delphi

delphi 枚举托盘图标

2006-12-06 18:53 253 查看
在写一个小程序时,要在托盘图标上查找 窗体标题和句柄,这当然需要枚举托盘图标了,上网搜索这方面的代码,基本上都是vb的,c++的都很少,而且千篇一律,而且都有问题,只好参考着这些有问题的vb和c++代码,一点点翻译成DELPHI的,然后再一点点调试修改,现在搞定了,分享给大家阿 :)

uses Commctrl

procedure enumTrayNotifyWnd;
var
wd:HWND;
wtd:HWND;
wd1:HWND;
pid:DWORD;
hd:THandle;
num,i:integer;
n:ULONG;
p:TTBBUTTON;
pp:^TTBBUTTON;
x:string;
name :array[0..255] of WCHAR;
whd,proid :ulong;
temp :string;
sp:^TTBBUTTON;
_sp:TTBButton;
begin
wd:=FindWindow('Shell_TrayWnd',nil);
if (wd=0) then
begin
showmessage('Error1');
exit;
end;
wtd:=FindWindowEx(wd,0,'TrayNotifyWnd',nil);
if (wtd=0) then
begin
showmessage('Error2');
exit;
end;

wtd:=FindWindowEx(wtd,0,'SysPager',nil);
if (wtd=0) then
begin
showmessage('SysPager');
exit;
end;

wd1:=FindWindowEx(wtd,0,'ToolbarWindow32',nil);
if (wd1=0) then
begin
showmessage('Error3');
exit;
end;

pid:=0;
GetWindowThreadProcessId(wd1,@pid);
if (pid=0) then
begin
showmessage('Error4');
exit;
end;

hd:=OpenProcess(PROCESS_ALL_ACCESS ,true,pid);
if (hd=0) then
begin
showmessage('Error6'#13+ IntToStr(hd));
exit;
end;

num:=SendMessage(wd1,TB_BUTTONCOUNT,0,0);

sp:=@_sp;
for i:= 0 to num do
begin
SendMessage(wd1,TB_GETBUTTON,i,integer(sp));

pp:=@p;
ReadProcessMemory(hd,sp,pp,sizeof(p),n);
//x:=Format('%x %x %x %x %x %x ',[p.iBitmap,p.idCommand,p.fsState,p.fsStyle,p.dwData,p.iString]);

name[0]:=char(0);
if (Cardinal(p.iString) <>$ffffffff) then
begin
try
ReadProcessMemory(hd,pointer(p.iString),@name,255,n);
name
:=char(0);
except
showmessage('except1')
end;
temp:=name;
try
whd:=0;
ReadProcessMemory(hd,pointer(p.dwData),@whd,4,n);
except
end;

proid:=0;
GetWindowThreadProcessId(whd,@proid);
x:=x+#13+Format('位置=%d 名称=%s 窗口句柄=%x 进程ID=%x',[i,temp,whd,proid]);
end;
end;
ShowMessage(x);
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: