Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.17;
Скачать: CL | DM;

Вниз

связь taskbar`а и окон   Найти похожие ветки 

 
dums   (2003-02-15 20:02) [0]

задача - получить заголовки окон (GetWindowText) только тех окон, которые имеют кнопки на таскбаре.
делаю раз:
h:=FindWindow("Shell_TrayWnd", Nil);
делаю два:
EnumChildWindows(h,@ChildTree,0);
получаю списочек:
{
Button
TrayNotifyWnd
21:30
ReBarWindow32
MSTaskSwWClass
SysTabControl32
ToolbarWindow32
}
с каким "окном" работать? и вообще правильно ли я рассуждаю?


 
Song ©   (2003-02-15 21:26) [1]

>>получить заголовки окон (GetWindowText) только тех окон, которые имеют кнопки на таскбаре.
EnumWindows()+проверка в Call-Back ф-ии.


 
dums   (2003-02-15 21:45) [2]

а как должна выглядеть проверка в callback функции?


 
Song ©   (2003-02-15 21:52) [3]

Трудно сказать, тебе же не нужны окна "свёрнутые в трей". Здесь надо эксперементировать. Ну для начала я думаю, что надо проверить IF GetParent(HWND)=0 then это_top_level окно, а дальше смотри по ситуации.


 
DVM ©   (2003-02-15 23:17) [4]

function IsAppWindow(Wnd:hWnd):boolean;
var WinStyle, ExStyle : LongInt;
begin
result:=true;
WinStyle := GetWindowLong(Wnd, GWL_STYLE);
ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
if ((WinStyle AND WS_VISIBLE) = 0) or
(GetWindow(Wnd, GW_OWNER)<>0) or
((ExStyle and WS_EX_TOOLWINDOW)<>0) then result:=false;
if (ExStyle and WS_EX_APPWINDOW)<>0 then result:=true;
end;
*****************************************
function GetTextFromWindow(Wnd: HWND): string;
var
TextLength: Integer;
Text: PChar;
begin
TextLength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
if TextLength = 0 then Result := ""
else
begin
GetMem(Text, TextLength + 1);
SendMessage(Wnd, WM_GETTEXT, TextLength + 1, Integer(Text));
Result := Text;
FreeMem(Text);
end;
end;
**************************

Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
if (IsAppWindow(wnd)) and (wnd<>Application.Handle) then
begin
...GetTextFromWindow...
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;



 
dums   (2003-02-16 09:35) [5]

большое спасибо :)
работает на ура


 
dums   (2003-02-16 09:48) [6]

но всё-таки было бы интересно узнать как работать напрямую с таскбаром :) что он из себя представляет? не полностью Shell_TrayWnd, а хотябы только SysTabControl32, на котором собственно и отображаются "кнопки" окошек.


 
DVM ©   (2003-02-16 11:57) [7]

Ничего особенного он из себя и не представляет. Окно (AppBar), та область где кнопки (я предполагаю) некоторое подобие панели, на которой динамически создаются кнопки. Эта панель прокручивается вместе с кнопками если необходимо.
И напрямую с ним работать вовсе не обязательно, если нужно делать так же как он. Панель задач ловит появление окон с помощью хуков на WH_SHELL, а также ловит факты изменения заголовков и иконок окон. Можно делать так же.
Вообще говоря, я пробовал сделать подобие панели задач и получилось вроде бы сносно. Эти куски кода, что выше как раз оттуда.


 
dums   (2003-02-16 12:27) [8]

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


 
DVM ©   (2003-02-16 15:52) [9]


> заголовки не только тех программ которые на таскбаре, а
> ещё и некоторых висящих в трее...

я знаю.
Немного измени функцию IsAppWindow и все будет ок.

Так сделано по одной причине. Некоторые извращенские окна стартуют с одним стилем окна, а потом меняют его на другой. Мне такие попадались. Из-за этого окно на экране есть, а на панели задач нету. Хотя по сути это главное окно приложения.

WinStyle := GetWindowLong(WindowHandle, GWL_STYLE);
ExStyle := GetWindowLong(WindowHandle, GWL_EXSTYLE);
WindowOwner := GetWindow(WindowHandle, GW_OWNER);
if (WindowOwner = 0) AND
((ExStyle AND WS_EX_TOOLWINDOW) = 0) AND
((WinStyle AND WS_VISIBLE) <> 0) then
Result := true;


 
dums   (2003-02-16 17:50) [10]

спасибо :)
вообще-то этот код выдаёт чуть-чуть не то, но суть я понял :) работает



Страницы: 1 вся ветка

Текущий архив: 2003.04.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-54880
Карелин Артем
2003-04-02 09:01
2003.04.17
Что за инфа в отклике сервера?


7-54931
AllOver2003
2003-02-19 14:32
2003.04.17
Определение видеопамяти


8-54753
belocarsk
2003-01-17 10:28
2003.04.17
TMediaPlayer


1-54670
MSTX
2003-04-02 16:33
2003.04.17
Шифрование файлов.


14-54835
handra
2003-03-28 16:00
2003.04.17
Технологии создания ПО