¿Cómo puedo obtener información sobre herramientas de los íconos del área de notificación?
-
18-09-2019 - |
Pregunta
Puedo enumerar las aplicaciones (identificador, pid, ruta) con íconos en el área de notificación y puedo controlar la posición de los íconos, pero no puedo obtener la información sobre herramientas.
¿Cómo puedo enumerar los íconos de la bandeja del sistema, incluida la información sobre herramientas?
Solución
A continuación, se pone a 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.
Otros consejos
El shell no proporciona ninguna posibilidad para inspeccionar iconos de notificación que no pertenecen a su programa.(Y no proporciona ninguna manera de enumerar ni siquiera los iconos que hacer pertenecer a su programa;se espera que ya los sepas).
Solía usar un programa que secuestraba algunos o todos los íconos y, opcionalmente, los mostraba en su propia ventana en lugar de en el área cerca del reloj, por lo que debió haber podido obtener una lista de todos los íconos.Fue Ahorro de bandejas, por Mike Lin.La fuente está disponible si deseas ver cómo funcionó su truco.
También puedes echar un vistazo a las respuestas a una pregunta anterior que preguntaba sobre controlar la posición de los iconos en el área de notificación.
Usted debe echar un vistazo a la madKernal paquete de madshis colección de componentes. Tiene unas interfaces para trabajar con trayicons . Tenga cuidado, sin embargo:
Con madKernel puede administrar iconos de la bandeja (ver API "Shell_NotifyIcon") de cualquier aplicación. Este tipo de funcionalidad es totalmente indocumentado, pero funciona bien desde Win95 a WinXP.
El ITrayIcon-interface tiene propiedades de pista, icono, posición y más.