![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Панель задач
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), анализировать параметры, делать что нужно, потом не забыть вызвать оригинальную функцию.