Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1203023268
Petr V. Abramov
2008-02-15 00:07
2008.03.30
как получить авто (или бытовой) кредит


15-1203318814
Шмелъ
2008-02-18 10:13
2008.03.30
Периодика?


2-1204288356
boba
2008-02-29 15:32
2008.03.30
Canvas.TextWidth


15-1203342468
Andrewtitoff
2008-02-18 16:47
2008.03.30
Почему Application.Terminate у меня не работает? =(((


2-1204542062
NewSer
2008-03-03 14:01
2008.03.30
Помогите сформулировать SQL запрос: where поле дата - пустое!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский