2010-02-04 3 views
5

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

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

ответ

1

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

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

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

Вы также можете ознакомиться с ответами на предыдущий вопрос, который задал вопрос о controlling the position of icons in the notification area.

+0

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

+0

Вы могли бы упомянуть об этом в вопросе: «Я могу перечислить значки, но я не могу получить подсказки. Вот код, который я использую. Пожалуйста, помогите заполнить пробелы». Вы прочитали вторую ссылку, которую я вам дал? –

+0

Да, я прочитал вторую ссылку. Я могу управлять значками в области уведомлений. Но это еще одна история. Используя тот же код более или менее, я могу перечислить значки в системном трее. (перевод с http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Но я не могу получить подсказку. –

2

Вы должны посмотреть на коллекцию компонентов madshis madKernal package. Он имеет некоторые интерфейсы для working with trayicons. Опасайтесь, однако:

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

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

Смежные вопросы