Как я могу получить всплывающие подсказки значков области уведомлений?
Я могу перечислять приложения (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 имеет свойства для подсказки, значка, положения и многого другого.