Вот мой метод протестирован Windows XP с и Delphi 2010, если вы используете версию DELPHI Wich не поддерживает юникод грим Shure конвертировать строки для чтения в 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.
Я могу перечислить иконки в systray Я могу перечислить приложение (handle, pid, path) Я могу контролировать положение значков. НО, но я не могу получить всплывающую подсказку. То, что я хотел бы знать. –
Вы могли бы упомянуть об этом в вопросе: «Я могу перечислить значки, но я не могу получить подсказки. Вот код, который я использую. Пожалуйста, помогите заполнить пробелы». Вы прочитали вторую ссылку, которую я вам дал? –
Да, я прочитал вторую ссылку. Я могу управлять значками в области уведомлений. Но это еще одна история. Используя тот же код более или менее, я могу перечислить значки в системном трее. (перевод с http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Но я не могу получить подсказку. –