Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Вниз

связь 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
14-54831
Думкин
2003-04-01 06:15
2003.04.17
День птиц, дураков и математиков


14-54830
AlexT1000
2003-03-31 16:14
2003.04.17
как принудитель очистить swap file


1-54573
AndrewK
2003-04-04 17:51
2003.04.17
Как скрыть столбец и строку в TStringGrid?


1-54566
spogi
2003-04-07 01:08
2003.04.17
Обычный, текстовой фал... (*.txt)


4-54939
alexrush
2003-02-15 12:00
2003.04.17
Desktops & WindowStations





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский