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;
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;
相关文章推荐
- Delphi清除右下角的托盘上无用的托盘图标(刷新托盘)
- Delphi里用托盘图标的注意事项
- delphi程序启动时不让其显示图标,也不在托盘中显示。
- Delphi实现系统托盘图标
- 如何设置delphi程序托盘图标
- Delphi清除右下角的托盘上无用的托盘图标(刷新托盘)
- Delphi刷新托盘,去掉非正常退出的程序的托盘图标
- Delphi中使用托盘图标
- Delphi编程制作托盘图标步骤讲解
- delphi 隐藏指定程序的托盘图标
- Delphi刷新托盘,去掉非正常退出的程序的托盘图标
- 如何有效的让系统托盘下的图标消失
- VC如何作出有动画效果的托盘图标
- ubuntu14.04,如何让从托盘消失的输入法图标再次显示出来?
- QT 实现一个任务栏托盘图标程序 weathertrayicon
- eMule代码分析-托盘图标
- 通过枚举窗口,实现最小化到托盘中程序的窗口显示
- 关闭或打开系统资源管理器的自带托盘图标
- delphi中从DLL,EXE,ICL中提取图标
- Java桌面应用程序创建系统托盘图标