¿Cómo puedo obtener información sobre herramientas de los íconos del área de notificación?

StackOverflow https://stackoverflow.com/questions/2203955

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top