Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2009, 06:37   #1
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию Как получить список окон кнопок которые появляются на панели задач?

есть одно "НО", я хочу создать свою панель задач, т.е. мне нужно чтобы эти кнопки отображались на моей панели если эксплорер не запущен
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 11.02.2009, 11:36   #2
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

В массиве список видимых процессов - окон
Код:
type
  TRecApp = record
    FileName: string;
    Handle: THandle;
    PID: THandle;
  end;

  TArray = array of TRecApp;

procedure GetProcessList(var sl: TArray; var len: integer);
var
  pe:TProcessEntry32W;
  ph, snap:THandle;//дескрипторы процесса и снимка
  mh:hmodule;//дескриптор модуля
  procs:array[0..$fff] of dword;//массив для хранения дескрипторов процессов
  count, cm:cardinal;//количество процессов
  i:integer;
  ModName:array[0..max_path] of char;//имя модуля
begin
  //sl.Clear;
  len := 0;
  SetLength(sl, len);

  if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //если это Win9x
    snap:=CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
    if integer(snap)=-1 then
    begin
      exit;
    end else
    begin
      pe.dwSize:=sizeof(pe);
      if Process32FirstW(snap, pe) then
      repeat
        len := len + 1;
        SetLength(sl, len);
        sl[len-1].FileName := string(pe.szExeFile);

        //sl.Add(string(pe.szExeFile));
      until not Process32NextW(snap, pe);
    end;
  end
  else
  begin //Если WinNT/2000/XP
    if not EnumProcesses(@procs, sizeof(procs), count) then
    begin
      exit;
    end;
    for i := 0 to count div 4 - 1 do
    begin
      ph:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                      false, procs[i]);
      if ph>0 then
      begin
        EnumProcessModules(ph, @mh, 4, cm);
        GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));


        len := len + 1;
        SetLength(sl, len);
        sl[len-1].FileName := string(ModName);
        sl[len-1].PID := procs[i];

        //sl.Add(ExtractFileName(string( ModName)));
        CloseHandle(ph);
      end;
    end;
  end;
end
knight вне форума Ответить с цитированием
Старый 19.02.2009, 20:49   #3
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

knight, не все гладко получается((,
E2003 Undeclared identifier: 'TProcessEntry32W'
E2003 Undeclared identifier: 'CreateToolhelp32Snapshot'
E2003 Undeclared identifier: 'th32cs_snapprocess'
E2066 Missing operator or semicolon
E2003 Undeclared identifier: 'Process32FirstW'
E2029 ')' expected but identifier 'szExeFile' found
E2003 Undeclared identifier: 'Process32NextW'
E2003 Undeclared identifier: 'EnumProcesses'
E2003 Undeclared identifier: 'EnumProcessModules'
E2003 Undeclared identifier: 'GetModuleFileNameEx'

найти не может , нужно какойто модуль подключить? какой?
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 19.02.2009, 21:46   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

для начала
uses Tlhelp32;
rpy3uH вне форума Ответить с цитированием
Старый 20.02.2009, 07:14   #5
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
Радость

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
для начала
uses Tlhelp32;
спасибо)), теперь все работает,
только формируется массив из всех запущенных процессов, а мне нужны только те у кого есть окно.

я добавлял условие

if (GetParent(arr23[i].Handle) = 0) or {(not IsIconic(arr23[i].Handle)) or }
(IsWindowVisible(arr23[i].Handle)) then

но оно не катит((, это ведь связано с хэндлом окна? только не могу разобраться как именно
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 20.02.2009, 08:31   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

не надо перебирать процессы. надо перебирать все окна в системе и выводить только главные и видимые.
rpy3uH вне форума Ответить с цитированием
Старый 20.02.2009, 09:58   #7
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

По окнам можно так пробежаться... Где нет названия, там нет окна...

Код:
var hwnd : integer;
    Buffer : ^TBuffer;
    count  : integer;
    s: string;
begin

 New(Buffer);
 hwnd := GetTopWindow(0);
 count := 0;
 while hwnd <> 0 do
  begin
    hwnd := GetNextWindow(hwnd, GW_HWNDNEXT);
    GetWindowText(hwnd, Buffer^, 254);
    s :=Buffer^;
    memo1.Lines.add(s + ', handle = ' + inttostr(hwnd));
  end;
  Dispose(Buffer);

end;
knight вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать форму по типу панели задач? Paul Hindenburg Win Api 1 21.11.2008 12:12
как спрятать прогу на панели задач aesoem Общие вопросы Delphi 4 05.08.2008 17:47
Как узнать список всех окон Никки Общие вопросы Delphi 5 23.01.2008 08:10
Как создать кнопку в панели для окон???? Angel86rus Общие вопросы Delphi 4 03.10.2007 19:01
Как включить/выключить автоматическое скрытие панели задач. fen Общие вопросы Delphi 2 10.07.2007 14:25