Как я могу получить всплывающие подсказки значков области уведомлений? - PullRequest
5 голосов
/ 05 февраля 2010

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

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

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

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

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

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

2 голосов
/ 05 февраля 2010

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

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

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

1 голос
/ 28 мая 2011

Вот мой метод, протестированный с 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.
...