2010-02-04 11 views

Respuesta

1

Aquí se prueba mi método con Windows XP y Delphi 2010 si está utilizando una versión de Delphi wich no admite Unicode marca Shure convertir las cadenas de leer como 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

El shell no proporciona la posibilidad de inspeccionar los iconos de notificación que no pertenecen a su programa. (Y no proporciona ninguna manera de enumerar incluso los iconos que do pertenecen a su programa, se espera que usted ya sabe acerca de aquellos.)

Solía ​​usar un programa que secuestró algunos o todos los iconos y opcionalmente, los muestra en su propia ventana en lugar de en el área cercana al reloj, por lo que debe haber sido capaz de obtener una lista de todos los iconos. Era TraySaver, por Mike Lin. La fuente está disponible si desea ver cómo funcionó su truco.

También puede consultar las respuestas a una pregunta anterior sobre controlling the position of icons in the notification area.

+0

puedo enumerar los iconos de the systray Puedo enumerar la aplicación (handle, pid, path) Puedo controlar la posición de los íconos. PERO no puedo obtener la información sobre herramientas. Eso es lo que me gustaría saber. –

+0

Podría haber mencionado eso en la pregunta: "Puedo enumerar los iconos, pero no puedo obtener la información sobre herramientas. Aquí está el código que estoy usando. Ayúdenme a completar los espacios en blanco". ¿Has leído el segundo enlace que te di? –

+0

Sí, leí el segundo enlace. Puedo controlar los iconos en el área de notificación. Pero esa es otra historia. Usando el mismo código más o menos puedo enumerar los iconos en la bandeja del sistema. (una traducción de http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Pero no puedo obtener su información sobre herramientas. –

2

Debería echar un vistazo a madKernal package de la colección de componentes de madshis. Tiene algunas interfaces para working with trayicons. Sin embargo, tenga en cuenta:

Con madKernel puede gestionar iconos de bandeja (consulte la API "Shell_NotifyIcon") de cualquier aplicación. Este tipo de funcionalidad está totalmente indocumentado, pero funciona bien desde win95 a winXP.

La interfaz ITrayIcon tiene propiedades para sugerencia, icono, posición y más.

Cuestiones relacionadas