![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какие стили должно иметь окно, для отображения его кнопки окна на
Seldon © (2004-03-10 16:16:00)Какие стили должно иметь окно, для отображения его кнопки окна на таскбаре?
Игорь Шевченко (2004-03-15 13:22:00) [1]DVM © (13.03.04 11:28)
Спасибо, поищем :)
DVM (2004-03-13 11:28:00) [2]
> Игорь Шевченко © (12.03.04 23:05) [10]
И моя и твоя функции путаются с окнами Microsoft Excel 2000/xp.
Если запустить эксель и создать в нем одна за другой две книги, то окон экселя получается три, а не 2 как на таскбаре.
Причем с вордом то же самое проходит нормально.
Игорь Шевченко (2004-03-12 23:05:00) [3]Мне в свое время нужна была функция, которая показывает окна, кнопки которых находятся на TaskBar'е. Вот что получилось:
function IsWindowOnTaskbar (WindowHandle: HWND): Boolean;
var
WinStyle, ExStyle : LongInt;
WindowOwner : HWND;
begin
WinStyle := GetWindowLong(WindowHandle, GWL_STYLE);
ExStyle := GetWindowLong(WindowHandle, GWL_EXSTYLE);
WindowOwner := GetWindow(WindowHandle, GW_OWNER);
Result := (WindowOwner = 0) and
((ExStyle and WS_EX_TOOLWINDOW) = 0) and
((WinStyle and WS_VISIBLE) <> 0);
end;
Тоже не совсем соответствует функции в win32k, но довольно близко. Картинка получается похожая на окна, перечисляемые во вкладке "Приложения" в Task Manager
DVM (2004-03-12 22:17:00) [4]Вот тебе функция, возвращает true, если окно должно быть на таскбаре. Не совсем верная, но в 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;
Seldon (2004-03-12 21:26:00) [5]Допустим делаю так:
function EnumWindowsCallback(Handle:HWnd;Param:LParam):Boolean; stdcall;
var
ExStyle:Integer;
function GetWindowTextStr(Handle:HWnd):String;
begin
SetLength(Result,GetWindowTextLength(Handle)+1);
SetLength(Result,GetWindowText(Handle,@Result[1],Length(Result)));
end;
begin
Result:=true;
ExStyle:=GetWindowLong(Handle,gwl_ExStyle);
if (ExStyle and WS_EX_APPWINDOW=0)and(ExStyle and WS_EX_TOOLWINDOW=0) then
Form1.ListBox1.Items.Add(GetWindowTextStr(Handle))
end;
begin
{...}
EnumWindows(@EnumWindowsCallback,0);
{...}
end.
В ListBox'e только Punto Switcher Main Window, который как раз на таскбаре и не отображается.
Что неверно?
VMcL (2004-03-11 22:51:00) [6]if ExStyle and WS_EX_APPWINDOW <> 0 then <есть> else <нету>
Seldon (2004-03-11 20:46:00) [7]Извиняюсь за глупый, наверное, вопрос.
Я получил ExStyle окна, как узнать, есть ли в нём WS_EX_APPWINDOW?
DVM (2004-03-10 21:08:00) [8]
> И всё? Другие значения не имеют?
имеют, но этого должно быть достаточно. Не должно быть WS_EX_TOOLWINDOW, подробнее на MSDN расписано в статье "The TaskBar"
Seldon (2004-03-10 20:58:00) [9]И всё? Другие значения не имеют?
DVM (2004-03-10 20:54:00) [10]WS_EX_APPWINDOW
Seldon (2004-03-10 18:53:00) [11]второ 'окно' лишнее.
Maverick (2004-03-10 16:23:00) [12]Таскбар окна его кнопки не отобразится без стиля....
Формулируй проще....