![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список программ свернутых в 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]Штатными средствами - никак.