Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 01.10.03 19:48
Оценка:
Как манипулировать в рантайме появлением кнопки на таскбаре? Насколько я понимаю после создания SetOwner и SetParent негодное программирование, а изменение стилей WS_EX_TOOLWINDOW и WS_EX_APPWINDOW не меняет ситауции.


04.08.07 17:02: Перенесено модератором из 'MFC' — Odi$$ey
Aml Pages Home
Re: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 03.10.03 16:41
Оценка:
Здравствуйте, Carc, Вы писали:

C>Как манипулировать в рантайме появлением кнопки на таскбаре? Насколько я понимаю после создания SetOwner и SetParent негодное программирование, а изменение стилей WS_EX_TOOLWINDOW и WS_EX_APPWINDOW не меняет ситауции.

Ну чего никаких идей как себя в рантайме показывать на тескбаре, удалять с тескбара?
Aml Pages Home
Кнопка на TaskBar в рантайм
От: Gurza Россия  
Дата: 06.10.03 03:18
Оценка:
#Имя: FAQ.winapi.hidefromtaskbar2
// #include <ShlObj.h > из PSDK 2001
// Удаление с панели

    CoInitialize(NULL);
    ITaskbarList *pTaskBar = 0;
    HRESULT hr = CoCreateInstance(CLSID_TaskbarList, 0, CLSCTX_ALL, IID_ITaskbarList, (void**)&pTaskBar);
    if(SUCCEEDED(hr))
    {
        pTaskBar->DeleteTab(m_hWnd);
        pTaskBar->Release();
    }    
    CoUninitialize();
Re[3]: Кнопка на TaskBar в рантайм
От: Gurza Россия  
Дата: 06.10.03 03:21
Оценка:
Или просто указать окну отца, тогда кнопка пропадёт

::SetWindowLong(m_hWnd, GWL_HWNDPARENT, (LONG)::GetDesktopWindow());
Re[4]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 06.10.03 18:56
Оценка:
Здравствуйте, Gurza, Вы писали:


G>Или просто указать окну отца, тогда кнопка пропадёт


G> ::SetWindowLong(m_hWnd, GWL_HWNDPARENT, (LONG)::GetDesktopWindow());

Угу, но а обратно включить? Я вин98 пробовал обратно отца выключить (SetParent(NULL) или же просче ::SetParent((HWND)NULL)), кнопичка не проявлялсь снова, может тескбар как-то перерисовать надо?
Aml Pages Home
Re[4]: Кнопка на TaskBar в рантайм
От: kero Россия  
Дата: 06.08.07 12:31
Оценка:
G>>Или просто указать окну отца, тогда кнопка пропадёт
G>> ::SetWindowLong(m_hWnd, GWL_HWNDPARENT, (LONG)::GetDesktopWindow());

Тут при GetDesktopWindow кнопка как раз НЕ пропадет...

А вообще в ветке обычная махровая путаница с parent и owner окнами, об этом см. здесь
Автор: kero
Дата: 05.08.07
.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Кнопка на TaskBar в рантайм
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 18.06.09 15:37
Оценка:
Здравствуйте, Carc, Вы писали:
C>Как манипулировать в рантайме появлением кнопки на таскбаре? Насколько я понимаю после создания SetOwner и SetParent негодное программирование, а изменение стилей WS_EX_TOOLWINDOW и WS_EX_APPWINDOW не меняет ситауции.

Да, с таскбаром можно управлять с помощью интерфейсов ITaskbarList, ITaskbarList2, ITaskbarList3 и ITaskbarList4, однако это вполне можно делать и с помощью WINAPI.

ТаскБар — есть обычный ТулБар, т.е. Toolbar Control, c тем лишь отличием, что создаётся и управляется системой, а это значит, что с ним можно проводить те же операции, что и с обычными тулбарами.
Т.е. получаем хэндл окна ТаскБара:

HWND hDesktop = GetDesktopWindow();
HWND hTray    = FindWindowEx( hDesktop , 0, "Shell_TrayWnd"   , 0 );
HWND hReBar   = FindWindowEx( hTray    , 0, "ReBarWindow32"   , 0 );
HWND hTask    = FindWindowEx( hReBar   , 0, "MSTaskSwWClass"  , 0 );
HWND hToolbar = FindWindowEx( hTask    , 0, "ToolbarWindow32" , 0 );


Ну а затем используем средства управления тулбарами:
Toolbar Controls Functions
Toolbar Controls Messages
Toolbar Controls Notifications
Toolbar Controls Structures

Следующий пример продемонстрирует как всё это правильно схавать: A tool to order the window buttons in your taskbar.

Удачи!
Rakafon.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
toolbar taskbar toolbarwindow32 itaskbarlist tbbutton
Re[2]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.06.09 15:41
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Carc, Вы писали:

C>>Как манипулировать в рантайме появлением кнопки на таскбаре? Насколько я понимаю после создания SetOwner и SetParent негодное программирование, а изменение стилей WS_EX_TOOLWINDOW и WS_EX_APPWINDOW не меняет ситауции.

R>Да, с таскбаром можно управлять с помощью интерфейсов ITaskbarList, ITaskbarList2, ITaskbarList3 и ITaskbarList4, однако это вполне можно делать и с помощью WINAPI.


R>ТаскБар — есть обычный ТулБар, т.е. Toolbar Control, c тем лишь отличием, что создаётся и управляется системой, а это значит, что с ним можно проводить те же операции, что и с обычными тулбарами.

R>Т.е. получаем хэндл окна ТаскБара:

R>
R>HWND hDesktop = GetDesktopWindow();
R>HWND hTray    = FindWindowEx( hDesktop , 0, "Shell_TrayWnd"   , 0 );
R>HWND hReBar   = FindWindowEx( hTray    , 0, "ReBarWindow32"   , 0 );
R>HWND hTask    = FindWindowEx( hReBar   , 0, "MSTaskSwWClass"  , 0 );
R>HWND hToolbar = FindWindowEx( hTask    , 0, "ToolbarWindow32" , 0 );
R>


R>Ну а затем используем средства управления тулбарами:

R>Toolbar Controls Functions
R>Toolbar Controls Messages
R>Toolbar Controls Notifications
R>Toolbar Controls Structures

R>Следующий пример продемонстрирует как всё это правильно схавать: A tool to order the window buttons in your taskbar.


R>Удачи!

R>Rakafon.
1) Пост выше вообще-то от 2003 году, ёпырш
2) Во вторых — таскбар это там где окна открытые показываются, и он как раз вовсе не тулбар
3) Шаманство с FindWindowEx + Shell_TrayWnd до добра в общем виде не доводят, это легко проверяется в Windows XP, причем можно даже из под админских прав в этом убедиться...
Aml Pages Home
Re[3]: Кнопка на TaskBar в рантайм
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 18.06.09 15:49
Оценка: :)
Здравствуйте, Carc, Вы писали:
C>таскбар это там где окна открытые показываются, и он как раз вовсе не тулбар
Да, совершенно верно, TaskBar — это там где окна открытые показываются, и он не Toolbar, вернее не просто Toolbar, а ТoolbarWindow32!
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
taskbar toolbar тoolbarwindow32
Re[3]: Кнопка на TaskBar в рантайм
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 18.06.09 15:52
Оценка:
Здравствуйте, Carc, Вы писали:
C>3) Шаманство с FindWindowEx + Shell_TrayWnd до добра в общем виде не доводят, это легко проверяется в Windows XP, причем можно даже из под админских прав в этом убедиться...

... мне интересно, вы думаете, что ITaskbarList реализован не с помощью FindWindowEx + Shell_TrayWnd, а с помощью чтения молитв всемогущему богу ассемблера !??
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
shell_traywnd findwindowex toolbar taskbar toolbarwindow32 itaskbarlist tbbutton
Re[4]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.06.09 16:02
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Carc, Вы писали:

C>>3) Шаманство с FindWindowEx + Shell_TrayWnd до добра в общем виде не доводят, это легко проверяется в Windows XP, причем можно даже из под админских прав в этом убедиться...

R>... мне интересно, вы думаете, что ITaskbarList реализован не с помощью FindWindowEx + Shell_TrayWnd, а с помощью чтения молитв всемогущему богу ассемблера !??

Мне куда как интереснее насколько это надежно будет работать — я не поленился и проверил. Результат печальный. А молитвы читать мне по большому счету по барабану на чем: на Си так на Си, на ассемблере дык можно и на нем, на VB дык и на VB могем, на Дельфи — ну и на оном можно хотя как-то исторически сложилось что не мое...

Это как бы все индиффирентно абсолютно, разные языки обладают разными достоинствами и слабостями, но подаваляющее большинство этих слабостей можно обойти, но для этого владеть надо не только в стиле "читаю со словарем, но не перевожу"
А вот к чему приведут эти танцы хорошо бы разработчику понимать, на то он и разработчик — а кодеров я во дворе за 2 пива найму
Я думаю не Сполски, не МакКоннелл идиотами не являются:
Информация для размышления
1) "Не важно насколько красивый код, если он не работает" ((C) точно не вспомню)
2) "Разработчик понимающий экономические последствия своих решений ценится на вес золота" ((С) МакКоннел). А надежность кода, да и просто возможность его работы с прогнозируемыми результатами это как минимум проявления хотя бы базового такого понимания...
Aml Pages Home
Re[4]: Кнопка на TaskBar в рантайм
От: Аноним  
Дата: 18.06.09 16:21
Оценка: +1
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Carc, Вы писали:

C>>3) Шаманство с FindWindowEx + Shell_TrayWnd до добра в общем виде не доводят, это легко проверяется в Windows XP, причем можно даже из под админских прав в этом убедиться...

R>... мне интересно, вы думаете, что ITaskbarList реализован не с помощью FindWindowEx + Shell_TrayWnd, а с помощью чтения молитв всемогущему богу ассемблера !??

ITaskbarList это документированный интерфейс который будет работать всегда, даже если микрософт переделает таскбар из тулбара в набор сердечек на блюдечке.
Кроме того кроме таскбара еще есть список окон в alt tab и трехмерный список с картинками в висте по win+tab. И ваш код благополучно обломается на нем.
Re[5]: Кнопка на TaskBar в рантайм
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 18.06.09 20:57
Оценка:
Здравствуйте, Carc, Вы писали:
C>Мне куда как интереснее насколько это надежно будет работать — я не поленился и проверил. Результат печальный.

... а вот с этого места можно поподробнее! Не в кривизне ли рук дело?

C>А молитвы читать мне по большому счету по барабану на чем: на Си так на Си, на ассемблере дык можно и на нем, на VB дык и на VB могем, на Дельфи — ну и на оном можно хотя как-то исторически сложилось что не мое...


... я где-то написал вам, что вам надо на ассемблере молитву почитать ??

C>А вот к чему приведут эти танцы хорошо бы разработчику понимать, на то он и разработчик — а кодеров я во дворе за 2 пива найму :)))


... где здесь вы видите танцы? по-моему обычная работа с виндовым контролом, точно такая же, как и работа с другими виндовыми контролами.

C>1) "Не важно насколько красивый код, если он не работает" ((C) точно не вспомню)


... думается мне, что своё мнение товарищ "Точно_Не_Вспомню" изменит сразу, как только получит таск в "прекрасно работающем приложении" изменить что-то, или добавить туда новую фичу, и открыв сорцы, вместо структурированного идиомами и паттернами, т.е. "красивого" с архитектурной точки зрения и с точки зрения понимания и читабельности кода, увидит один сплошной высер говнокодера, думаю тогда ему станет очень важно, насколько "красивый" код ему приходится править и поддерживать. Идиотская цитата. Вместо "Точно_Не_Вспомню", почитайте лучше банду четырёх, там такого идиотизма не пишут.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
taskbar toolbarwindow32 itaskbarlist
Re[5]: Кнопка на TaskBar в рантайм
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 18.06.09 20:57
Оценка:
Здравствуйте, Аноним, Вы писали:
А>ITaskbarList это документированный интерфейс который будет работать всегда, даже если микрософт переделает таскбар из тулбара в набор сердечек на блюдечке.
А>Кроме того кроме таскбара еще есть список окон в alt tab и трехмерный список с картинками в висте по win+tab. И ваш код благополучно обломается на нем.

Конечно, ежели завтра имплементация taskbar'а будет изменена (в Windows 7, например), то будет изменена и имплементация ITaskbarList'а, и он гарантированно останется рабочим. Да кто ж спорить-то будет! И ежели мне надо будет добавить кнопку на таскбар, или наоборот спрятать, то я это сделаю именно с помощью ITaskbarList'а. Но, если вам с taskbar'ом необходимо проделать вещи, которые ITaskbarList не даёт сделать, т.е. его интерфейса (а всех вариаций до ITaskbarList4) становится недостаточно для выполнения задачи? Мне именно такой таск и надо было сделать (мне нужно было иконку с текстом на кнопке на таскбаре поменять, без изменения оных у окна, за которые эта кнопка отвечает ... да я бы рад такой хнёй не заниматься, но таск — есть таск), поэтому я нашёл иное решение, и сюда запостил, чтобы другие разработчики, перед кем встанет такой же вопрос, могли здесь найти ответ. Потому что я сам при возникновении вопросов первым делом запускаю гугл с параметром "site:rsdn.ru", и только потом, не найдя ответа, ломлюсь в иные инстанции. По при решении вопроса, обязательно решение напишу сюда вопреки воплям всяких нубов: "ты год вопроса смотрел??? 2003-й же!".
Я ведь не утверждаю, что вышеописанный вариант лучше и проще, чем вариант с ITaskbarList'ом. Я просто говорю, что функциональности ITaskbarList'а может в один прекрасный момент не хватить, и тогда придётся применить более трудоёмкое и более затратное по времени решение, зато оно сработает. А ежели оно не зафурычит на новой версии винды, то придётся найти новое решение, работающее на новой версии, и обвернуть всё абстракциями, имплементация которых зависит от версии винды. Или вам никогда не приходилось писать софт, который по требованиям должен фурычить от Win98 до Vista? Или вам никогда не приходилось что-либо заворачивать, чтобы один и тот же интерфейс работал одинаково на разных платформах? Мне вот часто приходилось писать обёртки вокруг системных вызовов или каких-нибудь платформоспецифичных библиотек, чтобы обёртки компилились и работали и на Винде и на Линухе!
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
toolbar taskbar toolbarwindow32 itaskbarlist tbbutton кроссплатформенность
Re[4]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 19.06.09 16:56
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Carc, Вы писали:

C>>таскбар это там где окна открытые показываются, и он как раз вовсе не тулбар
R>Да, совершенно верно, TaskBar — это там где окна открытые показываются, и он не Toolbar, вернее не просто Toolbar, а ТoolbarWindow32!
Ну надо же... Какая аднака наблюдательность Вон она ка-а-ак — а мужики-то и не знают!
Заприметил таки особенность 2К\XP... Ну а в Windows 98 это кстати SysTabControl32, поэтому надумки Ракофона

а это значит, что с ним можно проводить те же операции, что и с обычными тулбарами.

вай как хорошо работать будут!
Верной дорогой идете товарищи ((C) Иван Сусанин)
Aml Pages Home
Re[6]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 19.06.09 17:50
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Carc, Вы писали:

C>>Мне куда как интереснее насколько это надежно будет работать — я не поленился и проверил. Результат печальный.

R>... а вот с этого места можно поподробнее! Не в кривизне ли рук дело?

здесь
Автор: Carc
Дата: 19.06.09


C>>А молитвы читать мне по большому счету по барабану на чем: на Си так на Си, на ассемблере дык можно и на нем, на VB дык и на VB могем, на Дельфи — ну и на оном можно хотя как-то исторически сложилось что не мое...


R>... я где-то написал вам, что вам надо на ассемблере молитву почитать ??

Я уж как-нибудь сам разберусь, что мне надо, а что нет.

C>>А вот к чему приведут эти танцы хорошо бы разработчику понимать, на то он и разработчик — а кодеров я во дворе за 2 пива найму


R>... где здесь вы видите танцы? по-моему обычная работа с виндовым контролом, точно такая же, как и работа с другими виндовыми контролами.

Повторим — здесь
Автор: Carc
Дата: 19.06.09
Aml Pages Home
Re[5]: Кнопка на TaskBar в рантайм
От: Carc Россия http://www.amlpages.com/home.php
Дата: 19.06.09 17:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Rakafon, Вы писали:


R>>Здравствуйте, Carc, Вы писали:

C>>>3) Шаманство с FindWindowEx + Shell_TrayWnd до добра в общем виде не доводят, это легко проверяется в Windows XP, причем можно даже из под админских прав в этом убедиться...

R>>... мне интересно, вы думаете, что ITaskbarList реализован не с помощью FindWindowEx + Shell_TrayWnd, а с помощью чтения молитв всемогущему богу ассемблера !??

А>ITaskbarList это документированный интерфейс который будет работать всегда, даже если микрософт переделает таскбар из тулбара в набор сердечек на блюдечке.
Разумно и аргументировано. Заморочка была в Win98\NT когда TaskBar пытался активизировать окно, подсунутое ему через и ITaskBar* и через WinAPI. В общем, поэтому и было плюнуто на это занятие, уж больно много различий для разных версий Windows... Попросту овчинка выделки не стоила.
А>Кроме того кроме таскбара еще есть список окон в alt tab и трехмерный список с картинками в висте по win+tab. И ваш код благополучно обломается на нем.
А кстати ITaskbar* как то взаимодействует с тем же списком в Atl Tab? В Win98\NT он этого не делал, а в виндах постарше как?
Кстати до списка Alt+Tab можно попробовать через IAccessible добраться, правда сам пока не пробовал.
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.