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

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

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

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.

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

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

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

Вам следует взглянуть на пакет madKernal, содержащий коллекцию компонентов madshis. Имеет несколько интерфейсов для работы с трайконами. Осторожно, хотя:

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

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

Другие вопросы по тегам