uses PsApi; // загрузка списка процессов в ListBox: procedure TForm1.Button1Click(Sender: TObject); var PIDs: array[0..1023] of DWORD; ProcName: array[0..300] of Char; ProcIcon: HICON; BR: DWORD; Count, Index: Integer; HProc: THandle; HMod: HMODULE; begin if EnumProcesses(@PIDs, SizeOf(PIDs), BR) then begin Count := BR div SizeOf(DWORD); for Index := 0 to Count - 1 do begin HProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PIDs[Index]); if HProc <> 0 then begin EnumProcessModules(HProc, @HMod, SizeOf(HMod), BR); GetModuleFilenameEx(HProc, HMod, ProcName, SizeOf(ProcName)); ProcIcon := ExtractIcon(HInstance, @ProcName, 0); //тут можно добавить проверку условия ProcIcon = 0, //чтобы назначить какую-нибудь иконку по умолчанию // если у процесса нет своей иконки ListBox1.Items.AddObject(ProcName, TObject(ProcIcon)); CloseHandle(HProc); end; end; end; end; // уничтожение созданных иконок при завершении приложения: procedure TForm1.FormDestroy(Sender: TObject); var Index: Integer; begin for Index := 0 to ListBox1.Items.Count - 1 do DestroyIcon(HICON(ListBox1.Items.Objects[Index])); end; // отрисовка ListBox: // (ListBox1.Style должно быть lbOwnerDrawFixed или lbOwnerDrawVariable) procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var HW: Integer; const TextOffset = 2; begin HW := ARect.Bottom - ARect.Top; // размер иконки будет равен высоте строчки DrawIconEx(ListBox1.Canvas.Handle, ARect.Left, ARect.Top, HICON(ListBox1.Items.Objects[Index]), HW, HW, 0, 0, DI_NORMAL); ListBox1.Canvas.TextOut(ARect.Left + HW + TextOffset, ARect.Top, ListBox1.Items.Strings[Index]); end;