Как я могу получить всплывающие подсказки значков области уведомлений?

Я могу перечислить приложения (дескриптор, pid, путь) с помощью значков в области уведомлений, и я могу контролировать положение значков, но не могу получить всплывающую подсказку.

Как я могу перечислить значки панели задач, включая всплывающие подсказки?


person Panos Kal.    schedule 04.02.2010    source источник


Ответы (3)


Вот мой метод, протестированный с windows xp и delphi 2010, если вы используете версию delphi, которая не поддерживает unicode, убедитесь, что вы конвертируете прочитанные строки в 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.
person opc0de    schedule 28.05.2011

Оболочка не предоставляет возможности для проверки значков уведомлений, не принадлежащих вашей программе. (И он не дает возможности перечислить даже значки, которые действительно принадлежат вашей программе; ожидается, что вы уже знаете о них.)

Раньше я использовал программу, которая захватывала некоторые или все значки и, при необходимости, отображала их в собственном окне, а не в области рядом с часами, поэтому она должна была получить список всех значков. Это был TraySaver Майка Лина. Источник доступен, если вы хотите увидеть, как работает его взлом.

Вы также можете взглянуть на ответы на предыдущий вопрос о управлении положением значки в области уведомлений.

person Rob Kennedy    schedule 04.02.2010
comment
Я могу перечислить значки в панели задач. Я могу перечислить приложение (дескриптор, pid, путь). Я могу контролировать положение значков. НО я не могу получить всплывающую подсказку. Это то, что я хотел бы знать. - person Panos Kal.; 06.02.2010
comment
Вы могли бы упомянуть об этом в вопросе: я могу перечислить значки, но не могу получить всплывающие подсказки. Вот код, который я использую. Пожалуйста, помогите заполнить пробелы. Вы прочитали вторую ссылку, которую я вам дал? - person Rob Kennedy; 06.02.2010
comment
Да я прочитал вторую ссылку. Я могу управлять значками в области уведомлений. Но это уже другая история. Используя тот же код более или менее, я могу перечислить значки в системном трее. (перевод из codeproject.com/KB/applications/ShellTrayInfo.aspx) Но я не могу получить их подсказку. - person Panos Kal.; 08.02.2010

Вам следует взглянуть на пакет madKernal из коллекции компонентов Madshis. У него есть несколько интерфейсов для работы с трейиконами. Однако будьте осторожны:

С помощью madKernel вы можете управлять значками в трее (см. API "Shell_NotifyIcon") любого приложения. Этот вид функциональности полностью недокументирован, но хорошо работает от win95 до winXP.

Интерфейс ITrayIcon имеет свойства подсказки, значка, положения и т. Д.

person Vegar    schedule 05.02.2010