Форум: "WinAPI";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
ВнизПанель задач Найти похожие ветки
← →
Deeman (2007-07-15 17:34) [0]Здравствуйте. Хочу создать аналог панели задач (кнопки запущенных программ). Какие команды посылают программы, чтобы попасть в панель задач? Какие структуры?
← →
RayGun © (2007-07-15 17:50) [1]Чтобы попасть в панель задач, окна получают флаг WS_EX_APPWINDOW. Этот параметр можно использовать в CreateParams соответствующей формы - добавить туда Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Если нужно создать аналог панели задач - то нужно перехватывать функцию создания окон - CreateWindow(Ex), анализировать параметры, делать что нужно, потом не забыть вызвать оригинальную функцию.
← →
Инс © (2007-07-15 18:13) [2]Чуть дополню:
> Чтобы попасть в панель задач, окна получают флаг WS_EX_APPWINDOW
Окна, не имеющие родительского окна, также попадают на панель задач. Но если даже окно имеет стиль WS_EX_APPWINDOW или не имеет родителя, при установке стиля WS_EX_TOOLWINDOW оно на панель задач не попадет.
> Если нужно создать аналог панели задач - то нужно перехватывать
> функцию создания окон - CreateWindow(Ex)...
Перехват API - жестоко, в данном случае можно отделаться глобальной ловушкой типа WH_CBT. Заодно с помощью нее ловить сворачивания/разворачивания окон и их уничтожение.
← →
RayGun © (2007-07-15 18:41) [3]> Инс © (15.07.07 18:13) [2]
Да, с перехватом CreateWindow я, видимо, погорячился.
← →
ASSERT (2007-07-16 04:40) [4]и про панель быстрого запуска не забудь
← →
Cj © (2007-07-16 07:16) [5]Незабудь про Tray, часы, язык, кнопку пуск
← →
Deeman (2007-07-16 07:18) [6]Спасибо, буду разбираться.
← →
Deeman (2007-07-27 19:52) [7]Попытался поставить ловушку. Создал 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;
При установки ловушки начинают вылезать ошибки уже запущенных программ, все рушится, закрывается. Короче полный хаус настает. Что делать?
← →
DVM © (2007-07-30 10:41) [8]
> Deeman
1) Следует использовать хук WH_SHELL
2) Для анимированной анимации окна в твою кнопку следует использовать недокументированнную функцию RegisterShellHook()
3) Для пущей надежности может быть стоит еще по таймеру перечитывать периодически список окон (особенно полезно для отлова консольных окон).
> Что делать?
Думать
← →
DVM © (2007-07-30 10:44) [9]Таскбар показывает вот такие окна (на 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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.058 c