![]() |
Systray icons and tips - how (x64 too)?
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? ![]()
Code:
Please share source too, if you can help me!
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 Thanks in advance! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz