Форум: "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.01 c