2010-02-04 2 views

Répondre

1

Voici ma méthode testé avec Windows XP et delphi 2010 si vous utilisez une version de wich delphi ne prend pas en charge unicode faire shure vous convertissez les chaînes lues 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

Le shell ne permet pas d'inspecter les icônes de notification qui n'appartiennent pas à votre programme. (Et il ne fournit aucun moyen de même les icônes énumération qui appartiennent à ne pas votre programme, vous devez connaître déjà de ceux-ci.)

je l'habitude d'utiliser un programme qui a détourné une partie ou toutes les icônes et facultativement les a montrés dans sa propre fenêtre au lieu de dans la région près de l'horloge, ainsi il doit avoir pu obtenir une liste de toutes les icônes. C'était TraySaver, par Mike Lin. La source est disponible si vous souhaitez voir comment son hack a fonctionné. Vous pouvez également consulter les réponses à une question précédente ayant trait à controlling the position of icons in the notification area.

+0

Je peux énumérer les icônes le systray Je peux énumérer l'application (handle, pid, path) Je peux contrôler la position des icônes. MAIS je ne peux pas obtenir l'info-bulle. C'est ce que j'aimerais savoir. –

+0

Vous auriez pu le mentionner dans la question: "Je peux énumérer les icônes, mais je ne peux pas obtenir les info-bulles, voici le code que j'utilise, merci de nous aider à remplir les espaces." Avez-vous lu le deuxième lien que je vous ai donné? –

+0

Oui, j'ai lu le deuxième lien. Je peux contrôler les icônes dans la zone de notification. Mais c'est une autre histoire. En utilisant plus ou moins le même code, je peux énumérer les icônes dans la barre d'état système. (Une traduction de http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Mais je ne peux pas obtenir leur info-bulle. –

2

Vous devriez jeter un oeil à la madKernal package de la collection de composants madshis. Il a quelques interfaces pour working with trayicons. Attention cependant:

Avec madKernel vous pouvez gérer les icônes de la barre des tâches (voir API "Shell_NotifyIcon") de n'importe quelle application. Ce type de fonctionnalité est totalement non documenté, mais fonctionne bien de win95 à winXP.

L'interface ITrayIcon possède des propriétés pour l'indice, l'icône, la position et plus encore.

Questions connexes