Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить список программ свернутых в SysTray?


MacRine ©   (2005-06-02 21:34:00) 

Господа, подскажите, как получить список программ свернутых в SysTray?


Anatoly Podgoretsky   (2005-06-04 15:44:00) [1]

Там нет программ.


Ученик   (2005-06-04 12:26:00) [2]

>MacRine   (02.06.05 21:34)  

Список ProcessID



uses
 CommCtrl;

function WindowProcessID(aWindow: HWnd): DWord;
begin
 GetWindowThreadProcessID(aWindow, Result)
end;

function FindChild(aParent: HWnd; aClassName: PChar): HWnd;
var
 Child: HWnd;
 szClassName: array[0..255] of Char;
begin
 Child := GetWindow(aParent, GW_CHILD);
 while Child <> 0 do begin
   if GetClassName(Child, szClassName, 255) > 0 then begin
     if StrIComp(szClassName, aClassName) = 0 then
       Result := Child
     else
       Result := FindChild(Child, aClassName);
     if Result <> 0 then Exit
   end;
   Child := GetWindow(Child, GW_HWNDNEXT)
 end;
 Result := 0
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 hProcess: THandle;
 hToolbar, hIconOwner: HWnd;
 ButtonInfo: TTBButtonInfo;
 pButtonInfo: ^TTBButtonInfo;
 i, iCount: Integer;
 dwSize: DWord;
begin
 hToolbar := FindChild(FindWindow('Shell_TrayWnd', ''), 'ToolbarWindow32');
 hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
             PROCESS_VM_WRITE or PROCESS_VM_READ, False, WindowProcessID(hToolbar));
 if hProcess <> 0 then try
   pButtonInfo := VirtualAllocEx(hProcess, nil, SizeOf(ButtonInfo), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
   try
     FillChar(ButtonInfo, SizeOf(ButtonInfo), 0);
     ButtonInfo.cbSize  := SizeOf(ButtonInfo);
     ButtonInfo.dwMask  := TBIF_LPARAM;
     if WriteProcessMemory(hProcess, pButtonInfo, @ButtonInfo, SizeOf(ButtonInfo), dwSize) then begin
       iCount := SendMessage(hToolbar, TB_BUTTONCOUNT, 0, 0);
       for i := 0 to iCount - 1 do
         if SendMessage(hToolbar, TB_GETBUTTONINFO, i, Integer(pButtonInfo)) <> - 1 then
           if ReadProcessMemory(hProcess, pButtonInfo, @ButtonInfo, SizeOf(ButtonInfo), dwSize) and
              ReadProcessMemory(hProcess, Pointer(ButtonInfo.lParam), @hIconOwner, 4, dwSize) then
             ListBox1.Items.Add(IntToStr(WindowProcessID(hIconOwner)))
     end
   finally
     VirtualFreeEx(hProcess, pButtonInfo, 0, MEM_RELEASE)
   end
 finally
   CloseHandle(hProcess)
 end
end;


DVM   (2005-06-03 10:25:00) [3]

послать широковещательное сообщение TaskbarCreated и поставить ловушку на WM_COPYDATA окна Shell_TrayWnd, отловив потом там те сообщения, что несут информацию о добавляемых иконках.
Только не все приложения обязаны при получении TaskbarCreated передобавить иконки.


Digitman   (2005-06-03 10:08:00) [4]


> программ свернутых в SysTray


ты сначала уточни, что ты подразумеваешь под этим ..


VMcL   (2005-06-03 00:01:00) [5]

Штатными средствами - никак.


Наверх

Титульная страница Поиск, карта сайта Написать письмо