请问如何得到托盘中所有程序图标? ( 积分: 200 )

  • 主题发起人 主题发起人 xiangxingzi
  • 开始时间 开始时间
X

xiangxingzi

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何得到托盘所有程序图标,并在程序中一个个显示出来?
最好能给出具体代码,谢谢!
 
顶一下,分不够可以追加!
 
继续追加我所有的分,所有的分奉送~~
 
帮顶................
 
关注中......
我也想知道
 
这个问题好辣手啊,关注中。。。。。,。。
 
//显示系统托盘图标的相关操作-----------------
function TFrm_pcInf.AddIcon(hwnd: HWND): Boolean; //加载托盘图标
begin
vg_nid.cbSize := sizeof(NOTIFYICONDATA);
vg_nid.Wnd := hwnd;
vg_nid.uID := vg_ID_MAIN;
vg_nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
vg_nid.uCallbackMessage := vg_Mdi_APP_NAME;
vg_nid.hIcon := LoadIcon(hInstance, 'MAINICON');
strCopy(vg_nid.szTip, vg_strNotifyTip);
AddIcon := Shell_NotifyIcon(NIM_ADD, @vg_nid);
end;

procedure TFrm_pcInf.minimize(sender: Tobject);
begin
AddIcon(handle); //加载托盘图标
ShowWindow(Application.handle, sw_hide)
end;

function TFrm_pcInf.RemoveIcon(hwnd: HWND): Boolean; //取消托盘图标
begin
vg_nid.cbSize := sizeof(NOTIFYICONDATA);
vg_nid.Wnd := hwnd;
vg_nid.uID := vg_ID_MAIN;
vg_nid.uFlags := 0;
RemoveIcon := Shell_NotifyIcon(NIM_DELETE, @vg_nid);
end;

procedure TFrm_pcInf.Notify(var Msg: TMessage); //传递信息托盘图标右键信息
var
Pt: TPoint;
begin
case Msg.LParam of
WM_RBUTTONDOWN:
begin
SetForeGroundWindow(vg_nid.wnd);
GetCursorPos(Pt);
Popupmenu.Popup(pt.x, pt.y);
end;
WM_LBUTTONDOWN:
begin
RemoveIcon(handle);
ShowWindow(Application.handle, SW_SHOWNORMAL);
end;
end;
end;
//-----------------


procedure TFrm_pcInf.FormCreate(Sender: TObject);
begin
Application.OnMinimize := minimize; //最小化事件激活托盘图标
end;

procedure TFrm_pcInf.FormDestroy(Sender: TObject);
begin
RemoveIcon(handle); //取消托盘图标
end;

不知道你要的是不是这个!~
 
最近做的项目也用到托盘,请参考以下代码
unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Menus, StdCtrls, Buttons, SHellApi, Grids, DBGrids, ADODB,
ComCtrls, jpeg, ExtCtrls;

Const
WM_NOTIFY=WM_USER+100;//自定义消息,用于处理图标点击鼠标事件
iid = 100; //用户自定义数值,全局变量NotifyIcon中使用
type
TMainForm = class(TForm)
BitBtn3: TBitBtn;
Label2: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
Image1: TImage;
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
N4: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N6: TMenuItem;
PopupMenu1: TPopupMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
procedure MenuItem2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure MenuItem4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
//应用程序最小化响应事件
procedure OnAppMinimize(Sender: TObject);
//自定义消息处理函数,处理鼠标单击托盘图标事件
//托盘图标响应事件(双击可关闭,单击可弹出菜单)
procedure OnNotify(var Msg : TMessage); message WM_NOTIFY;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
NotifyIcon:TNotifyIconDataA;//应用程序最小化响应函数变量
implementation

{$R *.dfm}

//主窗口创建时响应的函数
procedure TMainForm.FormCreate(Sender: TObject);
var
stemp:integer;
//Icon :TIcon;
begin
//在程序启动时屏蔽系统功能键(Ctrl+Alt+Delete)
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@stemp,0);
//在任务栏显示应用程序图标
with NotifyIcon do//NotifyIcon为全局变量
begin
cbSize:=SizeOf(TNotifyIconDataA);
Wnd:=Handle;//指向当前窗体的句柄
uID:=iid;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=WM_NOTIFY;
hIcon:=Application.Icon.Handle;
//获取ImageList1图标
//icon := TIcon.Create();
//MainForm.ImageList1.GetIcon(1,icon);//获取第二个图标
//hIcon := icon.Handle;
szTip:='信息管理系统';//鼠标移动到托盘图标上时的提示文字
end;
//应用程序最小化响应事件
Application.OnMinimize := OnAppMinimize;
end;

//主窗口最小化响应事件
procedure TMainForm.OnAppMinimize(Sender: TObject);
begin
if MainForm.Visible=True then
begin
//MessageDlg(#13+#10+'您已经制作了系统托盘!',
// mtInformation,[mbYes],0);
MainForm.Visible:=False;
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
end;
end;

//自定义消息处理函数,处理鼠标单击托盘图标事件
procedure TMainForm.OnNotify(var Msg: TMessage);
var
pos:TPoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK: //双击事件
begin
MainForm.Visible:=True ;
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
Application.Restore();
SetForegroundWindow(MainForm.Handle);
end;
WM_RBUTTONUP: //右键点击
begin
GetCursorPos(pos);
MainForm.PopupMenu1.Popup(pos.X, pos.Y);
end;
end;
end;

//主窗口关闭时删除托盘图标
procedure TMainForm.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
end;

//还原(删除托盘图标同时还原应用程序主窗口)
procedure TMainForm.MenuItem2Click(Sender: TObject);
var
msg:TMessage;
begin
msg.LParam:=WM_LBUTTONDBLCLK;
OnNotify(msg);
end;

//退出(删除应用程序托盘图标)
procedure TMainForm.MenuItem4Click(Sender: TObject);
begin
MainForm.Visible:=True;
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
end;

//确定(创建应用程序托盘图标同时隐藏应用程序主窗口)
procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
with NotifyIcon do//NotifyIcon为全局变量,在程序的开头已经定义了
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体MainForm的句柄
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=WM_NOTIFY;
//hIcon:=Application.Icon.Handle;
//icon := TIcon.Create();
//MainForm.ImageList1.GetIcon(1,icon);//获取第二个图标
//hIcon := icon.Handle;
hIcon :=Application.Icon.Handle;
szTip:='信息管理系统';//鼠标移动到托盘图标上时的提示文字
end;
MessageDlg(#13+#10+'您已经制作了系统托盘!',
mtInformation,[mbYes],0);
MainForm.Visible:=False;
//Application.Minimize;
//ShowWindow(Application.Handle,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);//把设置
//好的变量NotifyIcon加入到系统中以便处理
end;

//取消(删除应用程序托盘图标)
procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
end;

//退出
procedure TMainForm.BitBtn3Click(Sender: TObject);
begin
Close;
end;

end.
 
楼主是问[red]请问如何得到托盘中所有程序图标[/red]?
所有的。
 
读出当前用户C:/Documents and Settings/用户名/桌面 下的所有文件,然后分析,如果是.lnk文件,则读内容,找到指向的文件及路径,再抽取.exe文件中的图标。大部分可以通过这样的方式获取。

我有做过取一个文件夹里面所有.exe文件图标的。有几分相似吧。
 
关注中,我早就想知道了

--说我灌水
 
难道大富翁的人都喜欢答非所问?????~~~~~!!!!!
空间有限,请先看清楚问题,
会的请帮忙解答,小弟不胜感激;不明白的帮顶就行了,不要乱帖代码,谢谢!

TB_BUTTONCOUNT 可以得到图标数量 接下来应该如何一一对应图标,就不清楚了,望高手指教!!!
 
var
hProcess, hShellTrayWnd, hTrayNotifyWnd, hSyspager, hToolbarWindow32, hTargetHwnd : THandle;
i : Integer;
tb : _TBBUTTON;
szBuffer : array[0..255] of Char;
dwProcessId, dwNumberOfBytesRead, dwSize : DWORD;
pBase : Pointer;
begin
hShellTrayWnd := FindWindow('Shell_TrayWnd', nil);
hTrayNotifyWnd := FindWindowEx( hShellTrayWnd, 0, 'TrayNotifyWnd', nil );
hSyspager := FindWindowEx( hTrayNotifyWnd, 0, 'Syspager', nil );
hToolbarWindow32 := FindWindowEx( hSyspager, 0, 'ToolbarWindow32', nil );

GetWindowThreadProcessId( hShellTrayWnd, @dwProcessId );
hProcess := OpenProcess( PROCESS_ALL_ACCESS or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, false, dwProcessId );
if( hProcess <> 0 ) then
begin
dwSize := sizeof(_TBBUTTON) + 255;
pBase := VirtualAllocEx( hProcess, nil, dwSize, MEM_COMMIT, PAGE_READWRITE );
for i := 0 to SendMessage( hToolbarWindow32, TB_BUTTONCOUNT, 0, 0 ) - 1 do
begin
if SendMessage( hToolbarWindow32, TB_GETBUTTON, i, LPARAM(pBase) ) <> 0 then
begin
ReadProcessMemory( hProcess, pBase, @tb, sizeof(_TBBUTTON), dwNumberOfBytesRead );
SendMessage( hToolbarWindow32, TB_GETBUTTONTEXT, tb.idCommand, LongInt(pBase) + sizeof(_TBBUTTON) );
// 取得标题
ReadProcessMemory( hProcess, Pointer(LongInt(pBase) + sizeof(_TBBUTTON)), @szBuffer[0], dwSize - sizeof(_TBBUTTON), dwNumberOfBytesRead );
// 取得窗口
ReadProcessMemory( hProcess, Pointer(tb.dwData), @hTargetHwnd, sizeof(THandle), dwNumberOfBytesRead );
//
ShowMessage(szBuffer);
end;
end;
VirtualFree( pBase, dwSize, MEM_RELEASE );
end;
CloseHandle(hProcess);
 
to amli :
我想得到的是图标显示, 文字提示我已经得到了。

得到图标,是不是要用到 TB_GETIMAGELIST ? 怎么做?能告知一下吗?
 
看看这里
http://support.microsoft.com/default.aspx?scid=KB;EN-US;811415

需要使用Mscomctl.ocx来解决
 
to amli :

方便加我QQ吗 : 28765841
 
好像得不到呀:(

哪位大侠可以帮帮我,不胜感激。
 
放分吧,不过还没有接受答案
 
放分吧,不过还没有接受答案
 
后退
顶部