Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить список такой-же как в TaskManagere 
V
    Опции темы
Ak47black
  Дата 15.5.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здраствуйте.
Вообшем неполучаеться сделать также как в 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 
PM MAIL   Вверх
Ak47black
Дата 15.5.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Первую проблему решил.
Может кто насшет второй что подскажет?

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

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

Лан извиняюсь за флуд.
PM MAIL   Вверх
aNGELO
Дата 24.5.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.6.2006

Репутация: нет
Всего: нет



Цитата

Код

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 часа ночи

Это сообщение отредактировал(а) aNGELO - 24.5.2007, 00:21
PM MAIL ICQ YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.