Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как получить список такой-же как в TaskManagere


Автор: Ak47black 15.5.2007, 20:01
Здраствуйте.
Вообшем неполучаеться сделать также как в TaskManagere
Вот что я сумел сделать
Код

function GetIcon(const FileName: string): TIcon;
var
  FileInfo: TShFileInfo;
  ImageList: TImageList;
  IT: DWORD;
begin
  IT := SHGFI_SMALLICON;
  Result := TIcon.Create;
  ImageList := TImageList.Create(nil);
  FillChar(FileInfo, Sizeof(FileInfo), #0);
  ImageList.ShareImages := true;
  ImageList.Handle := SHGetFileInfo(
    PChar(FileName),
    SFGAO_SHARE,
    FileInfo,
    sizeof(FileInfo),
    IT or SHGFI_SYSICONINDEX
    );
  ImageList.GetIcon(FileInfo.iIcon, Result);
  ImageList.Free;
end;

function GetAppFileName(hWnd: THandle) :string;
var
  dPID: dWord;
  hHandle: THandle;
begin
  GetWindowThreadProcessId(hWnd, @dPID);
  SetLength (Result, MAX_PATH);
  hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
  if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0 then
    SetLength (Result, StrLen (PChar (Result)));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Wnd : hWnd;
  buff: array [0..127] of Char;
  lpFilename: string;
  TempIcon: TIcon;
begin
  ActiveAppList.Clear;
  Wnd := GetWindow(Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (Wnd <> Application.Handle) and IsWindowEnabled(Wnd) and IsWindowVisible(Wnd) and (GetWindow(Wnd, gw_Owner) = 0) and (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      SetLength(lpFilename, MAX_PATH);
      TempIcon:= GetIcon(GetAppFileName(Wnd));
      ActiveAppListImageList.AddIcon(TempIcon);
      TempIcon.Free;
      if StrPas(buff)<>'Program Manager' then
      with ActiveAppList.Items.Add do
      begin
        Caption:= StrPas(buff);
        ImageIndex:= ActiveAppListImageList.Count-1;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
  ActiveAppList.ItemIndex := 0;
end;

Код рабочий но выдает немного неточный результат
Есть две неточности
  • Выдает не все окна которые в TaskManagere показываються
  • Иконка извлекаеться по пути и поэтому не во всех случая такая-же как в TaskManagere, набы как-то сделать что-бы по Хэндолу получать

Добавлено через 42 секунды
Помоги советом как тут сделать  smile 

Автор: Ak47black 15.5.2007, 20:37
Первую проблему решил.
Может кто насшет второй что подскажет?

Добавлено через 7 минут и 3 секунды
Решил вторую
Код

      TempIcon.Handle:= CopyIcon(GetClassLong(Wnd, GCL_HICONSM ));

Лан извиняюсь за флуд.

Автор: aNGELO 24.5.2007, 00:20
Цитата

Код

function GetAppFileName(hWnd: THandle) :string;
var
  dPID: dWord;
  hHandle: THandle;
begin
  GetWindowThreadProcessId(hWnd, @dPID);
  SetLength (Result, MAX_PATH);
  hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
  if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0 then
    SetLength (Result, StrLen (PChar (Result)));
end;



Короче.
1) Ты хочешь написать нечто вроде закладки "Приложения" в taskmgr (я так понял).
2) Есть мелкомягкая фича: если FindWindow(nil,nil), то возвращается хендл верхнего окна.
3) Есть модуль TlHelp32, ИМХО там есть все что пожелаешь для работы с образами [запущенными процессами] мне кажется, лучше тренироваться на процессах, чем на окнах.
4) Можно просто выдергивать ресурсы из файла (экзешник тоже файл, а иконка - обычный ресурс)



сорри на число не смотрел ыыы жестоко в 1.5 часа ночи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)