Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Панель задач


Deeman ©   (2007-07-15 17:34:00) 

Здравствуйте. Хочу создать аналог панели задач (кнопки запущенных программ). Какие команды посылают программы, чтобы попасть в панель задач? Какие структуры?


DVM   (2007-07-30 10:44:00) [1]

Таскбар показывает вот такие окна (на 99.9% совпадает с панелью задач, немного неправильно ведет себя с окнами экселя в ряде случаев):


function IsAppWindow(Wnd: HWND): BOOL;
var
Style, ExtStyle: LongInt;
hOwner, hParent: HWND;
begin
Result := true;
if not IsWindow(Wnd) then
 begin
   Result := false;
   exit;
 end;
Style := GetWindowLong(Wnd, GWL_STYLE);
ExtStyle := GetWindowLong(Wnd , GWL_EXSTYLE);
hOwner := GetWindow(Wnd, GW_OWNER);
hParent := GetParent(Wnd);
if (Style and WS_CHILD) <> 0 then result := false;
if (Style and WS_VISIBLE) = 0 then Result := false;
if not IsWindowVisible(Wnd) then Result := false;
if (ExtStyle and  WS_EX_TOOLWINDOW) <> 0 then Result := false;
if (ExtStyle and  WS_EX_MDICHILD) <> 0 then Result := false;

if (hOwner <> 0) and ((ExtStyle and WS_EX_APPWINDOW) = 0) then result := false;
if (hOwner <> 0) and Result then Result := not IsAppWindow(hOwner);

if hParent <> 0 then Result := false;
end; // End of function IsAppWindow;


DVM   (2007-07-30 10:41:00) [2]


> Deeman

1) Следует использовать хук WH_SHELL
2) Для анимированной анимации окна в твою кнопку следует использовать недокументированнную функцию RegisterShellHook()
3) Для пущей надежности может быть стоит еще по таймеру перечитывать периодически список окон (особенно полезно для отлова консольных окон).


> Что делать?

Думать


Deeman   (2007-07-27 19:52:00) [3]

Попытался поставить ловушку. Создал dll. Код функции при срабатывании ловушки WH_CBT:

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
 wn:PChar;
begin
 if code = HCBT_CREATEWND then
 begin
  Wnd:=TMsg(Pointer(lParam)^).hwnd;
  GetWindowText(wnd,wn,sizeof(wn));
  MessageBox(0, wn, 'Created Window', 0);
 end;
 Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;


При установки ловушки начинают вылезать ошибки уже запущенных программ, все рушится, закрывается. Короче полный хаус настает. Что делать?


Deeman   (2007-07-16 07:18:00) [4]

Спасибо, буду разбираться.


Cj   (2007-07-16 07:16:00) [5]

Незабудь про Tray, часы, язык, кнопку пуск


ASSERT   (2007-07-16 04:40:00) [6]

и про панель быстрого запуска не забудь


RayGun   (2007-07-15 18:41:00) [7]

> Инс ©   (15.07.07 18:13) [2]
Да, с перехватом CreateWindow я, видимо, погорячился.


Инс   (2007-07-15 18:13:00) [8]

Чуть дополню:

> Чтобы попасть в панель задач, окна получают флаг WS_EX_APPWINDOW

Окна, не имеющие родительского окна, также попадают на панель задач. Но если даже окно имеет стиль WS_EX_APPWINDOW или не имеет родителя, при установке стиля WS_EX_TOOLWINDOW оно на панель задач не попадет.


> Если нужно создать аналог панели задач - то нужно перехватывать
> функцию создания окон  - CreateWindow(Ex)...

Перехват API - жестоко, в данном случае можно отделаться глобальной ловушкой типа WH_CBT. Заодно с помощью нее ловить сворачивания/разворачивания окон и их уничтожение.


RayGun   (2007-07-15 17:50:00) [9]

Чтобы попасть в панель задач, окна получают флаг WS_EX_APPWINDOW. Этот параметр можно использовать в CreateParams соответствующей формы - добавить туда Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Если нужно создать аналог панели задач - то нужно перехватывать функцию создания окон  - CreateWindow(Ex), анализировать параметры, делать что нужно, потом не забыть вызвать оригинальную функцию.


Наверх

Титульная страница Поиск, карта сайта Написать письмо