![]() |
Re: How to enumerate all trayicons in the taskbar
:S
Im using the 32 bit system and it works fine ... :gruebel: |
Re: How to enumerate all trayicons in the taskbar
Zitat:
|
Re: How to enumerate all trayicons in the taskbar
ive just edited my previous post :)
Ok the current one (that ive just uploaded) should work on 64 bit systems.. |
Re: How to enumerate all trayicons in the taskbar
No, still doesn't work. Now I see four empty rectangles, but I have five two icons in the TNA and the icons aren't displayed anyway.
|
Re: How to enumerate all trayicons in the taskbar
:S
i have no idea why it does not work on 64 bit sys. yeah i know that problem :) e.g if i open the xplorer i cann see 7 entries in my program .. here is the code if someone needs it :)
Delphi-Quellcode:
(btw. thanks jonas - again :P)
//types
type TTBBUTTON = packed record // 20 iBitmap: Integer; idCommand: Integer; fsState: Byte; fsStyle: Byte; bReserved: array[1..2] of Byte; dwData: Longint; iString: Integer; end; PTNAEntry = ^TTNAEntry; TTNAEntry = record hwnd: Cardinal; uID: Integer; uCallbackMessage: Cardinal; Unknwon1: Array[0..1] of Cardinal; hIcon: Cardinal; Unknwon2: Array[0..2] of Cardinal; uniPath: string; sTip: string; iBitmap: Cardinal; idCommand: Integer; fsState: byte; fsStyle: byte; dwData: Cardinal; iString: Cardinal; end; TTNAEntryArr = Array of TTNAEntry; // funcs function GetTNAEntries(): TTNAEntryArr; var but: TTBBUTTON; hWnd, PID, hProc: Cardinal; MEM: Pointer; Count: Cardinal; x: Cardinal; i: Integer; buf: WideChar; p: PWideChar; const TB_GETBUTTON = WM_USER+$17; //23; TB_BUTTONCOUNT = WM_USER+$18; //24; begin hWnd := FindWindowEx( FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',0), 0, 'TrayNotifyWnd', 0 ), 0, 'SysPager', 0 ), 0, 'ToolbarWindow32', 0 ); GetWindowThreadProcessID( hWnd, @PID ); try hProc := OpenProcess( PROCESS_ALL_ACCESS, False, PID ); MEM := VirtualAllocEx( hProc, nil, SizeOf(TTBButton), MEM_COMMIT, PAGE_EXECUTE_READWRITE ); Count := SendMessage( hWnd, TB_BUTTONCOUNT, 0, 0 ); SetLength(Result, Count); for i := 0 to Count - 1 do begin SendMessage( hWnd, TB_GETBUTTON, i, integer(MEM) ); ReadProcessMemory( hProc, MEM, @but, SizeOf(TTBBUTTON), x ); Move( but, Result[i].hwnd, sizeof(but) ); if but.iString > 0 then begin p := Pointer(but.iString); repeat ReadProcessMemory( hProc, p, @buf, 2, x ); inc(p); Result[i].sTip := Result[i].sTip + buf; until buf = #0; end; ReadProcessMemory( hProc, Pointer(but.dwData), @result[i].hwnd, 36, x ); end; finally VirtualFreeEx( hProc, MEM, SizeOf(TTBButton), MEM_DECOMMIT ); CloseHandle( hProc ); end; end; |
AW: How to enumerate all trayicons in the taskbar
Hi,
auch wenn es schon eine Weile her ist. Der Grund, warum es nicht auf 64bit funktioniert ist:
Code:
Ist zwar C++ Code, es sollte aber dennoch gut ersichtlich sein, daß die Struktur unter 64bit geringfügig anders ist. Die Struktur Deines Codes ist statisch und berücksichtigt das nicht. :thumb:
typedef struct _TBBUTTON {
int iBitmap; int idCommand; BYTE fsState; BYTE fsStyle; #ifdef _WIN64 BYTE bReserved[6] // padding for alignment #elif defined(_WIN32) BYTE bReserved[2] // padding for alignment #endif DWORD_PTR dwData; INT_PTR iString; } TBBUTTON, NEAR *PTBBUTTON *LPTBBUTTON; Oops, English required... :-) The structure on 64bit systems is slightly different (bigger). The structure you're using is static and does not consider the 64bit variant. Regards, Carsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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