2010-02-04 14 views

risposta

1

Ecco il mio metodo collaudato con Windows XP e Delphi 2010, se si utilizza una versione di Delphi wich non supporta Unicode make shure di convertire le stringhe lette ANSI

uses CommCtrl; 

function TForm1.GetIconsCount: Integer; 
begin 
    Result := SendMessage(FindTrayToolbar, TB_BUTTONCOUNT, 0, 0); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ListTips; 
end; 

function TForm1.FindTrayToolbar: HWND; 
begin 
    Result := FindWindow('Shell_TrayWND', nil); 
    Result := FindWindowEx(Result, 0, 'TrayNotifyWnd', nil); 
    Result := FindWindowEx(Result, 0, 'SysPager', nil); 
    Result := FindWindowEx(Result, 0, 'ToolbarWindow32', nil); 
end; 

procedure TForm1.ListTips; 
var 
    dwTray: DWORD; 
    wndTray: HWND; 
    hTray: THandle; 
    remoteTray: Pointer; 
    tdata: TTBBUTTON; 
    i: Integer; 
    btsread:DWORD; 
    str:Pchar; 
begin 
    wndTray := FindTrayToolbar; 
    GetWindowThreadProcessId(wndTray, @dwTray); 
    hTray := OpenProcess(PROCESS_ALL_ACCESS, false, dwTray); 
    if hTray <> 0 then 
    begin 
    remoteTray := VirtualAllocEx(hTray, nil, Sizeof(tdata), MEM_COMMIT, 
     PAGE_READWRITE); 
    for i := 0 to GetIconsCount - 1 do 
    begin 
     SendMessage(FindTrayToolbar,TB_GETBUTTON,wparam(i),lparam(remotetray)); 
     ReadProcessMemory(hTray,remotetray,@tdata,sizeof(tdata),btsread); 
     GetMem(str,255); 
     ReadProcessMemory(hTray,Ptr(tdata.iString),str,255,btsread); 
     ListBox1.Items.Add(str); 
     end; 
     end 
     else ShowMessage('Could not locate tray icons'); 
    end; 
    end. 
4

La shell non fornisce alcuna funzionalità per l'ispezione delle icone di notifica che non appartengono al programma. (E fornisce alcun modo di enumerare anche le icone che Do appartengono al vostro programma, ci si aspetta di sapere già di quelli.)

Ho usato per usare un programma che dirottato alcune o tutte le icone e facoltativamente li ha visualizzati nella propria finestra anziché nell'area vicino all'orologio, quindi deve essere stato in grado di ottenere un elenco di tutte le icone. Era TraySaver, di Mike Lin. La fonte è disponibile se desideri vedere come ha funzionato il suo trucco.

Puoi anche dare un'occhiata alle risposte a una domanda precedente che ha chiesto di controlling the position of icons in the notification area.

+0

posso enumerare le icone the systray Posso enumerare l'applicazione (handle, pid, path) Posso controllare la posizione delle icone. MA non riesco a trovare il suggerimento. Questo è quello che mi piacerebbe sapere. –

+0

Avresti potuto dire che nella domanda: "Posso enumerare le icone, ma non riesco a ottenere le descrizioni dei comandi. Ecco il codice che sto usando. Ti preghiamo di compilare gli spazi vuoti." Hai letto il secondo link che ti ho dato? –

+0

Sì, ho letto il secondo link. Posso controllare le icone nell'area di notifica. Ma questa è un'altra storia. Utilizzando lo stesso codice più o meno posso enumerare le icone nella barra delle applicazioni. (una traduzione da http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Ma non riesco a ottenere il loro suggerimento. –

2

Si dovrebbe dare un'occhiata allo madKernal package della raccolta di componenti madshis. Ha alcune interfacce per working with trayicons. Attenzione, però:

Con madKernel è possibile gestire le icone del vassoio (consultare API "Shell_NotifyIcon") di qualsiasi applicazione. Questo tipo di funzionalità è totalmente non documentato, ma funziona bene da win95 a winXP.

L'interfaccia ITrayIcon ha proprietà per suggerimento, icona, posizione e altro.

Problemi correlati