2010-02-04 11 views

Odpowiedz

1

Tu jest moja metoda przetestowane z Windows XP i Delphi 2010, jeśli używasz wersji Delphi wich nie obsługuje Unicode make SHURE konwertowanie ciągi odczytane 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

Powłoka nie zapewnia możliwości sprawdzania ikon powiadomień, które nie należą do twojego programu. (I nie daje możliwości wyliczenia nawet ikon, które są przypisane do twojego programu, oczekuje się, że już o nich wiesz.)

Użyłem programu, który porwał niektóre lub wszystkie ikony i opcjonalnie wyświetlał je w swoim własnym oknie zamiast w obszarze w pobliżu zegara, więc musiała być w stanie uzyskać listę wszystkich ikon. To był TraySaver, Mike Lin. Źródło jest dostępne, jeśli chcesz zobaczyć, jak działał jego hack.

Możesz również rzucić okiem na odpowiedzi na poprzednie pytanie z pytaniem o numer controlling the position of icons in the notification area.

+0

mogę wyliczyć ikony w the systray Potrafię wymienić aplikację (uchwyt, pid, ścieżka) Mogę kontrolować pozycję ikon. ALE nie dostaniemy podpowiedzi. To, co chciałbym wiedzieć. –

+0

Mogłeś wspomnieć o tym w pytaniu: "Potrafię wymienić ikony, ale nie mogę uzyskać podpowiedzi. Oto kod, którego używam. Pomóż wypełnić puste pola". Czy przeczytałeś drugi link, który ci dałem? –

+0

Tak, czytam drugi link. Mogę kontrolować ikony w obszarze powiadomień. Ale to już inna historia. Przy użyciu tego samego kodu więcej lub mniej mogę wyliczyć ikony w zasobniku systemowym. (tłumaczenie z http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Ale nie mogę uzyskać ich porady. –

2

Powinieneś rzucić okiem na madKernal package kolekcji komponentów madshis. Ma kilka interfejsów dla working with trayicons. Należy jednak pamiętać, że:

Za pomocą metody madKernel można zarządzać ikonami w zasobach (zobacz API "Shell_NotifyIcon") dowolnej aplikacji. Ten rodzaj funkcji jest całkowicie nieudokumentowany, ale działa dobrze od wersji Win95 do WinXP.

Interfejs ITrayIcon ma właściwości wskazówka, ikona, pozycja i więcej.

Powiązane problemy