Hello!
I'd like to make an application with i can enumerate all icons (with tips) from the system tray. I tried to make this, and now i can retrieve the names of processes, but not more. Some days ago i did found a VB code that's working in Delphi too.
type
Tray=record
hwnd: HWND;
uID: UINT;
uCallbackMessage: UINT;
Reserved1: array[0..1] of longint;
Reserved2: array[0..2] of longint;
hIcon: HICON;
end;
_TBBUTTON64 = packed record
iBitmap: Integer;
idCommand: Integer;
fsState: Byte;
fsStyle: Byte;
Padding1: Byte;
Padding2: Byte;
Padding3: Byte;
Padding4: Byte;
Padding5: Byte;
Padding6: Byte;
dwData: Longint;
iString: Integer;
end;
procedure TForm1.Button1Click(Sender
: TObject);
var
hProc: THandle;
hWindow: Hwnd;
lppid: UINT;
lpPointer: ^pointer;
ret: dword;
tb64: _TBBUTTON64;
dwIndex: integer;
dwCount: integer;
lphwnd: Hwnd;
begin
ListBox1.Clear;
hWindow:=FindWindow('Shell
_TrayWnd',
nil);
hWindow:=FindWindowEx(hWin
dow,0,'Tra
yNotifyWnd
', nil);
hWindow:=FindWindowEx(hWin
dow,0,'Sys
Pager', nil);
hWindow:=FindWindowEx(hWin
dow,0,'Too
lbarWindow
32', nil);
dwCount:=SendMessage(hWind
ow,TB_BUTT
ONCOUNT,0,
0);
GetWindowThreadProcessId(h
Window,@lp
Pid);
hProc:=OpenProcess(PROCESS
_VM_OPERAT
ION or PROCESS_VM_READ,false,lpPi
d);
lpPointer:=VirtualAllocEx(
hProc,nil,
sizeof(tb6
4),MEM_COM
MIT,PAGE_R
EADWRITE);
for dwIndex:=0 to dwCount-1 do
begin
SendMessage(hWindow,TB_GET
BUTTON,wpa
ram(dwInde
x),lparam(
lpPointer)
);
ReadProcessMemory(hProc,lp
Pointer,@t
b64,sizeof
(tb64),ret
);
if tb64.dwData<>0 then
begin
ReadProcessMemory(hProc,PC
har(tb64.d
wData),@lp
hWnd,4,ret
);
ListBox1.Items.Add(GetProc
essNameFro
mWnd(lphWn
d));
end;
end;
VirtualFreeEx(hProc,lpPoin
ter,0,MEM_
RELEASE);
CloseHandle(hProc);
end;
##########################
##########
##########
##########
##########
##########
##########
#######
Today i searched the Net and i found an another code that's able to enumerate all icons, tips from systray and compatible with x64 systems too.
It tested on Windows 2000, XP, Vista 32-bit and Windows 7 64-bit noted in the article description. I examined this code and i didn't find any unknown function for Delphi (to my mind) but i don't know how can i realize it under Delphi. Is there any way to change this code to Delphi and can be compatible with x64 too?
http://www.quickmacros.com/forum/viewtopic.php?f=11&t=3745&p=16536&hilit=TRAYICONINFO#p16536function hwnd ARRAY(TRAYICONINFO)&a mask ;;mask: 1 get tooltip, 2 get hwnd, hicon, callbackMsg, callbackId
//hwnd - tray toolbar control handle. If 0, the function tries to find the control.
//a - receives each icon info:
//tooltip - tooltip text.
//hidden - 0 if the icon is visible, 1 if hidden.
//idCommand - toolbar control button id.
//hwnd - handle of window that added the icon.
//hicon - icon handle.
//callbackMsg, .callbackId - on mouse and other events the window receives this message with this id.
//mask - must be 3 to get all info. If some info not needed, use 0, 1 or 2. It will make faster.
//EXAMPLE
//out
//#compile "__TRAYICONINFO"
//ARRAY(TRAYICONINFO) a
//EnumTrayIcons 0 a 3
//int i
//for i 0 a.len
//TRAYICONINFO& r=a[i]
//if(r.hidden) continue
//RecGetWindowName r.hwnd &_s
//out "tt='%s' idcmd=%i window=%s hicon=%i callbackId=%i callbackMsg=%i" r.tooltip r.idCommand _s r.hicon r.callbackId r.callbackMsg
type __SHTRAYICON hwnd callbackId callbackMsg unknown[2] hIcon
type __SHTRAYICON64 %hwnd callbackId callbackMsg unknown[2] %hIcon
type TBBUTTON64 iBitmap idCommand !fsState !fsStyle !bReserved[6] %dwData %iString
a=0
if(!hwnd) hwnd=child("" "ToolbarWindow32" "+Shell_TrayWnd" 0x1); if(!hwnd) end ES_WINDOW
int i n=SendMessage(hwnd TB_BUTTONCOUNT 0 0)
if(!n) ret
lock _share
TBBUTTON* bq=share
TBBUTTON* be=share(hwnd)
word* tq=bq+sizeof(TBBUTTON64)
word* te=be+sizeof(TBBUTTON64)
if(mask&2)
,GetWindowThreadProcessId(
hwnd &_i)
,__Handle hp=OpenProcess(PROCESS_VM_
OPERATION|
PROCESS_VM
_READ 0 _i)
for i 0 n
,if(!SendMessage(hwnd TB_GETBUTTON i be)) continue
,TRAYICONINFO& ti=a[]
,ti.hidden=bq.fsState&TBST
ATE_HIDDEN
!0
,ti.idCommand=bq.idCommand
,if(mask&1)
,,_i=SendMessage(hwnd TB_GETBUTTONTEXTW bq.idCommand 0)
,,if(_i<0 or _i>450 or SendMessage(hwnd TB_GETBUTTONTEXTW bq.idCommand te)<0) tq[0]=0
,,ti.tooltip.ansi(tq)
,if(mask&2)
,,if(!_win64)
,,,__SHTRAYICON sti
,,,if(ReadProcessMemory(hp
+bq.dwData &sti sizeof(sti) 0))
,,,,ti.callbackId=sti.call
backId
,,,,ti.callbackMsg=sti.cal
lbackMsg
,,,,ti.hicon=sti.hIcon
,,,,ti.hwnd=sti.hwnd
,,else
,,,__SHTRAYICON64 sti64
,,,if(ReadProcessMemory(hp
+bq.iString &sti64 sizeof(sti64) 0)) ;;64-bit dwData offset == 32-bit iString offset
,,,,ti.callbackId=sti64.ca
llbackId
,,,,ti.callbackMsg=sti64.c
allbackMsg
,,,,ti.hicon=sti64.hIcon
,,,,ti.hwnd=sti64.hwnd
Please share source too, if you can help me!
Thanks in advance!