Einzelnen Beitrag anzeigen

Alberto

Registriert seit: 10. Aug 2009
1 Beiträge
 
#1

Systray icons and tips - how (x64 too)?

  Alt 11. Aug 2009, 18:55
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.


Code:
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(hWindow,0,'TrayNotifyWnd', nil);
hWindow:=FindWindowEx(hWindow,0,'SysPager', nil);
hWindow:=FindWindowEx(hWindow,0,'ToolbarWindow32', nil);

dwCount:=SendMessage(hWindow,TB_BUTTONCOUNT,0,0);

GetWindowThreadProcessId(hWindow,@lpPid);
hProc:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ,false,lpPid);
lpPointer:=VirtualAllocEx(hProc,nil,sizeof(tb64),MEM_COMMIT,PAGE_READWRITE);

for dwIndex:=0 to dwCount-1 do
begin

SendMessage(hWindow,TB_GETBUTTON,wparam(dwIndex),lparam(lpPointer));
ReadProcessMemory(hProc,lpPointer,@tb64,sizeof(tb64),ret);

if tb64.dwData<>0 then
begin
ReadProcessMemory(hProc,PChar(tb64.dwData),@lphWnd,4,ret);
ListBox1.Items.Add(GetProcessNameFromWnd(lphWnd));
end;

end;

VirtualFreeEx(hProc,lpPointer,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/vie...CONINFO#p16536

Code:
function 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&TBSTATE_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.callbackId
,,,,ti.callbackMsg=sti.callbackMsg
,,,,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.callbackId
,,,,ti.callbackMsg=sti64.callbackMsg
,,,,ti.hicon=sti64.hIcon
,,,,ti.hwnd=sti64.hwnd
Please share source too, if you can help me!
Thanks in advance!
  Mit Zitat antworten Zitat