Re[3]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 28.11.12 18:46
Оценка: 3 (1)
Здравствуйте, BurningInside, Вы писали:

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

O>>Посмотрите здесь — http://msdn.microsoft.com/en-us/library/windows/desktop/cc144179(v=vs.85).aspx
O>>Нужно подписаться на событие "TaskbarCreated", оно приходит при запуске оболочки (и после ее
O>>перезапуска тоже). Пришло событие — ок, можно звать Shell_NotifyIcon. На Vista и выше может
O>>дополнительно потребоваться ChangeWindowMessageFilter(Ex). Например, если программа работает
O>>на более высоком integrity level, чем оболочка (explorer.exe).
BI>Гениально
Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.

Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.
Я делал иначе:
1. На WM_CREATE пробовал вписать свою иконку, благо приложение по жизни живет в трее.
2. Если не удавалось и Shell_NotifyIcon + NIM_ADD возвращал FALSE, тогда создавал фоновый поток.
3. Этот фоновый поток определенное число раз ждал секунды две-три в WaitForSingleObject, потом просыпался
и дергал окно которое должно было создать иконку в трее (ну что-то вроде RegisterWindowMessage+SendMessage)
4. Окно получало это сообщение от фонового потока, и опять пыталось вписать свою иконку в трей.
5. Если на этот раз удавалось, т.е. Shell_NotifyIcon + NIM_ADD все-таки отвечала TRUE, то в ответ на сообщение возвращало TRUE. Фоновый поток получал результат: что если мол TRUE, завершался. Если нет — опять по кругу — ждем пару-тройку секунд, и опять дергаем основное окно, чтобы попыталось впихнуть иконку.

Ну понятное дело, были мелочи, на которые нужно было обратить внимание. Фоновый поток ждал в WaitForSingleObject некий мьютекс единственный на приложение, который отвечал за запуск повторной копии софтины. Соответственно если софтина выходила раньше, чем удавалось впихнуть иконку, потом умирал своей собственной смертью. Ну и какие-то там параметры передавались потоку: сколько спать между попытками впихнуть иконку, сколько раз пытаться.

Проверял на 2-ух софтинах. Результат отличный — иконка встает в трей иногда с первого раза при автозапуске, иногда с третьего, иногда еще с какого. Но результат достигнут.
Aml Pages Home
Re[5]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 14.12.12 16:21
Оценка: 3 (1)
Здравствуйте, Andrew S, Вы писали:

C>>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.


AS>Это не так. Все, что надо — на WM_CREATE перед созданием иконки _сначала_ зарегистрировать сообщение, а затем поискать Shell_TrayWnd. Если найдено — идти регистрировать, добавление в этом случае вернет ошибку только если действительно проблемы у эксплорера, но тогда ждать бессмысленно.



AS>PS Я смотрю, вы не ищете простых путей решения задач, да...

Для решения да... легких путей не ищем. Ищем другое — решение.
Все проще оказалось. Покопался в логах, в общем судя по ним трей-бар уже есть FindWindow "ShellTrayWnd" уже его видит. Но все равно ShellNotify_Icon + NIM_ADD возвращала FALSE. И фишка была закопана в GetLastError после операции — возвращала ERROR_TIMEOUT.

Так что хоть доуподписывайтесь вы на "TaskBarCreated" в такой стадии оно больше не придет, т.к. оно уже просто давным-давно пролетело мимо еще до нашей WM_CREATE. Что интересно, то мой код исключительно для проверки на всякий случай подписывался на TaskBarCreated, ан хрен! нету его — ибо как сказал выше, прошло уже.

PS: что характерно, код не тестовый, а из живого реального проекта — который уже по всей сети бинарниками расползся по варезникам. Это вам не на поделках в лабораторных условиях проверять.
Aml Pages Home
Re: Проверить/отловить доступность TaskBar - как?
От: okman Беларусь https://searchinform.ru/
Дата: 28.11.12 17:42
Оценка: +1
Здравствуйте, BurningInside, Вы писали:

BI>Есть прога, автостартует. Винды после ХР что-то там улучшили с более быстрой загрузкой в итоге не всегда прога отображает иконку в трее. Далеко за примером ходить не надо: Essential Security, так что это не мои проги (руки) кривые .


BI>А вот и вопрос: есть ли идеи, как проверить/отловить момент доступность/"отвечаемость" TaskBar? Есть ли "официальные" рекомендации как это кодить? Чтобы не колхозить с циклом. Или колхозить?


Посмотрите здесь — http://msdn.microsoft.com/en-us/library/windows/desktop/cc144179(v=vs.85).aspx
Нужно подписаться на событие "TaskbarCreated", оно приходит при запуске оболочки (и после ее
перезапуска тоже). Пришло событие — ок, можно звать Shell_NotifyIcon. На Vista и выше может
дополнительно потребоваться ChangeWindowMessageFilter(Ex). Например, если программа работает
на более высоком integrity level, чем оболочка (explorer.exe).
Re[5]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 28.11.12 19:09
Оценка: +1
Здравствуйте, BurningInside, Вы писали:

[поскипано]
BI>Ок, лучше Вашей схемы не придумать. Тоже будет поток, ну и из-за своей специфики без мьютекса, будет цикл на 10 шагов * внутренний Sleep(1000) итого 10 секунд. Если не будет хватать, можно 20 сек или бесконечно, пока TRUE не вернётся.

Ну как-то так — у меня все-равно по любому был мьютекс, который отвечал за работу всего приложения (гуёвый поток, повторные копии, некоторые фоновые ожидалки в том числе и его ждали). Ну да это не суть — можно ждать объект, можно и просто поспать некоторое время.
Aml Pages Home
Re[6]: Проверить/отловить доступность TaskBar - как?
От: Andrew S Россия http://alchemy-lab.com
Дата: 14.12.12 20:15
Оценка: -1
C>>>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.

AS>>Это не так. Все, что надо — на WM_CREATE перед созданием иконки _сначала_ зарегистрировать сообщение, а затем поискать Shell_TrayWnd. Если найдено — идти регистрировать, добавление в этом случае вернет ошибку только если действительно проблемы у эксплорера, но тогда ждать бессмысленно.



AS>>PS Я смотрю, вы не ищете простых путей решения задач, да...

C>Для решения да... легких путей не ищем. Ищем другое — решение.
C>Все проще оказалось. Покопался в логах, в общем судя по ним трей-бар уже есть FindWindow "ShellTrayWnd" уже его видит. Но все равно ShellNotify_Icon + NIM_ADD возвращала FALSE. И фишка была закопана в GetLastError после операции — возвращала ERROR_TIMEOUT.

Код и условия воспроизведения в студию. Пенисометрией у кого больше кода и где работает я заниматься не собираюсь — это неконструктивно. Жалоб на вариант c регистрацией сообщения + FindWindow не было.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Проверить/отловить доступность TaskBar - как?
От: BurningInside Россия  
Дата: 28.11.12 17:18
Оценка:
Есть прога, автостартует. Винды после ХР что-то там улучшили с более быстрой загрузкой в итоге не всегда прога отображает иконку в трее. Далеко за примером ходить не надо: Essential Security, так что это не мои проги (руки) кривые .

А вот и вопрос: есть ли идеи, как проверить/отловить момент доступность/"отвечаемость" TaskBar? Есть ли "официальные" рекомендации как это кодить? Чтобы не колхозить с циклом. Или колхозить?
Re[2]: Проверить/отловить доступность TaskBar - как?
От: BurningInside Россия  
Дата: 28.11.12 18:34
Оценка:
Здравствуйте, okman, Вы писали:
O>Посмотрите здесь — http://msdn.microsoft.com/en-us/library/windows/desktop/cc144179(v=vs.85).aspx
O>Нужно подписаться на событие "TaskbarCreated", оно приходит при запуске оболочки (и после ее
O>перезапуска тоже). Пришло событие — ок, можно звать Shell_NotifyIcon. На Vista и выше может
O>дополнительно потребоваться ChangeWindowMessageFilter(Ex). Например, если программа работает
O>на более высоком integrity level, чем оболочка (explorer.exe).

Гениально
Re[4]: Проверить/отловить доступность TaskBar - как?
От: BurningInside Россия  
Дата: 28.11.12 19:06
Оценка:
Здравствуйте, Carc, Вы писали:

C>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.


C>Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.

C>Я делал иначе:
C>1. На WM_CREATE пробовал вписать свою иконку, благо приложение по жизни живет в трее.
C>2. Если не удавалось и Shell_NotifyIcon + NIM_ADD возвращал FALSE, тогда создавал фоновый поток.
C>3. Этот фоновый поток определенное число раз ждал секунды две-три в WaitForSingleObject, потом просыпался
C> и дергал окно которое должно было создать иконку в трее (ну что-то вроде RegisterWindowMessage+SendMessage)
C>4. Окно получало это сообщение от фонового потока, и опять пыталось вписать свою иконку в трей.
C>5. Если на этот раз удавалось, т.е. Shell_NotifyIcon + NIM_ADD все-таки отвечала TRUE, то в ответ на сообщение возвращало TRUE. Фоновый поток получал результат: что если мол TRUE, завершался. Если нет — опять по кругу — ждем пару-тройку секунд, и опять дергаем основное окно, чтобы попыталось впихнуть иконку.

C>Ну понятное дело, были мелочи, на которые нужно было обратить внимание. Фоновый поток ждал в WaitForSingleObject некий мьютекс единственный на приложение, который отвечал за запуск повторной копии софтины. Соответственно если софтина выходила раньше, чем удавалось впихнуть иконку, потом умирал своей собственной смертью. Ну и какие-то там параметры передавались потоку: сколько спать между попытками впихнуть иконку, сколько раз пытаться.


C>Проверял на 2-ух софтинах. Результат отличный — иконка встает в трей иногда с первого раза при автозапуске, иногда с третьего, иногда еще с какого. Но результат достигнут. и дергал окно которое должно было создать иконку в трее (ну что-то вроде RegisterWindowMessage+SendMessage)

CНу понятное дело, были мелочи, на которые нужно было обратить внимание. Фоновый поток ждал в WaitForSingleObject некий мьютекс единственный на приложение, который отвечал за запуск повторной копии софтины. Соответственно если софтина выходила раньше, чем удавалось впихнуть иконку, потом умирал своей собственной смертью. Ну и какие-то там параметры передавались потоку: сколько спать между попытками впихнуть иконку, сколько раз пытаться.

Ок, лучше Вашей схемы не придумать. Тоже будет поток, ну и из-за своей специфики без мьютекса, будет цикл на 10 шагов * внутренний Sleep(1000) итого 10 секунд. Если не будет хватать, можно 20 сек или бесконечно, пока TRUE не вернётся.
Re[4]: Проверить/отловить доступность TaskBar - как?
От: CEMb  
Дата: 29.11.12 02:11
Оценка:
Здравствуйте, Carc, Вы писали:

BI>>Гениально

C>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.

Я таскбар ищу через
m_hTray = FindWindowEx(NULL, NULL, _T("Shell_TrayWnd"),NULL);


Плюс проверка на видимость, потому что разных таскбаров в системе может быть много одновременно.
Re[5]: Проверить/отловить доступность TaskBar - как?
От: BurningInside Россия  
Дата: 29.11.12 15:17
Оценка:
Здравствуйте, CEMb, Вы писали:
CEM>Я таскбар ищу через
CEM>
CEM>m_hTray = FindWindowEx(NULL, NULL, _T("Shell_TrayWnd"),NULL);
CEM>


CEM>Плюс проверка на видимость, потому что разных таскбаров в системе может быть много одновременно.


Идея хорошая, но 1) таскбар может "не отвечать" 2) те же издержки, что и если просто проверять бай Шелл_НотифайАйкон, к тому же не так надёжно для данной задачи
Re[4]: Проверить/отловить доступность TaskBar - как?
От: fuyant  
Дата: 03.12.12 01:48
Оценка:
Здравствуйте, Carc, Вы писали:

C>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.


C>Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.

C>Я делал иначе:

ммм... а в чем проблема то?
почему не создавать иконку и при старте, и при приходе TaskbarCreated?
ну, можно еще перед созданием делать NIM_DELETE на всякий случай
И создастся иконка в любом случае, или на старте программы, или после создания таскбара. Зачем такие сложности с потоками, циклами и мьютексами для такой простой задачи?
к тому же TaskbarCreated в любом случае нужно ловить, т.к. таскбар может рухнуть посреди работы или юзер может перегрузить эксплорер не вылогиниваясь
Re[5]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.12.12 06:57
Оценка:
Здравствуйте, fuyant, Вы писали:

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


C>>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.


C>>Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.

C>>Я делал иначе:

F>ммм... а в чем проблема то?

F>почему не создавать иконку и при старте, и при приходе TaskbarCreated?
В том, что иконка не создается... И TaskBar вполне уже может быть создан, и и сообщение "TaskBarCreated" больше не придет. А все равно Shell_NotifyIcon + NIM_ADD вернет FALSE. И чего тогда ждать?
Aml Pages Home
Re[6]: Проверить/отловить доступность TaskBar - как?
От: fuyant  
Дата: 03.12.12 12:25
Оценка:
Здравствуйте, Carc, Вы писали:

F>>ммм... а в чем проблема то?

F>>почему не создавать иконку и при старте, и при приходе TaskbarCreated?
C>В том, что иконка не создается... И TaskBar вполне уже может быть создан, и и сообщение "TaskBarCreated" больше не придет. А все равно Shell_NotifyIcon + NIM_ADD вернет FALSE. И чего тогда ждать?

я вот с таким никогда не сталкивался, если честно
есть какой-то момент, когда таскбар создан, но не хочет принимать на себя иконку и Shell_NotifyIcon + NIM_ADD вернет FALSE?
по твоим словам,
C>Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.
т.е. false оно возвращает только когла нет таскбара. С другой стороны, ты говоришь, что
C>И TaskBar вполне уже может быть создан, и и сообщение "TaskBarCreated" больше не придет.
я вот немного запутался.

почему меня все это удивляет, ты вот говоришь, что
C>Проверял на 2-ух софтинах. Результат отличный — иконка встает в трей иногда с первого раза при автозапуске, иногда с третьего, иногда еще с какого. Но результат достигнут.
с другой стороны, я создавал иконоки на XP/Win7 тем простым способом, что я писал
Две такие свои программы сам у себя же и использую уже года четыре. И вот честно говоря не помню, чтобы не появилась у них иконка (конечно же, мог не обратить внимания). ОДна программа запускается через Run ключ реестра, другая — через виндовый шедулер.
И мне сильно интересно, если и в самом деле есть какой косяк, а я просто его не замечал.
С другой стороны, у меня еще автостартует proxess explorer, так вот его икона в трее иногда может не появиться.
Re[7]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.12.12 12:59
Оценка:
Здравствуйте, fuyant, Вы писали:

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


F>>>ммм... а в чем проблема то?

F>>>почему не создавать иконку и при старте, и при приходе TaskbarCreated?
C>>В том, что иконка не создается... И TaskBar вполне уже может быть создан, и и сообщение "TaskBarCreated" больше не придет. А все равно Shell_NotifyIcon + NIM_ADD вернет FALSE. И чего тогда ждать?

F>я вот с таким никогда не сталкивался, если честно

А я вот регулярно... Через день это в течении месяцев наблюдал. И все никак в толк не мог взять — что за фигня, ну нету иконки. Причем не всегда — сегодня есть, завтра нету. На это старте винды иконка есть, на следующем нету. И исключительно в результате автозапуска софтины. Если ручками пустить, все отлично.
Все на свой код косяки кидал, а потом когда и второй проект начала такие же фортеля выкидывать, заставило призадуматься.

F>есть какой-то момент, когда таскбар создан, но не хочет принимать на себя иконку и Shell_NotifyIcon + NIM_ADD вернет FALSE?

F>по твоим словам,
C>>Кстати говоря, пока таскбар не создан Shell_NotifyIcon + NIM_ADD будет упорно возвращать FALSE.
F>т.е. false оно возвращает только когла нет таскбара.
Я что-то говорю!?! Я ничего не говорю. Говорит MSDN. Что FALSE означает неудачу. Про причину они как всегда умалчивают.

F>С другой стороны, ты говоришь, что

C>>И TaskBar вполне уже может быть создан, и и сообщение "TaskBarCreated" больше не придет.
F>я вот немного запутался.
Все просто: к моменту старта софтины тескбар уже создан, и соответственно рассылать сообщение "TaskBarCreated" он уже больше не будет. Т.к. уже создан. А мои две софтины, стоящие в автостарте судя по всему попадают где-то в промежуток. Т.е. они попросту не успевают получить TaskBarCreated, именно потому что они подписываются на его получение (пущают свою WndProc несколько позже). Соответственно дожидаться больше нечего. Таскбар есть, сообщение больше рассылаться не будет. Полагаться на поиски через FindWindow в те еще прятки играть с Microsoft. Завтра они что-нить переименуют в классах окна, и код нерабочим становится. Остается только полагаться на Shell_NotifyIcon + NIM_ADD.

F>почему меня все это удивляет, ты вот говоришь, что

C>>Проверял на 2-ух софтинах. Результат отличный — иконка встает в трей иногда с первого раза при автозапуске, иногда с третьего, иногда еще с какого. Но результат достигнут.
F>с другой стороны, я создавал иконоки на XP/Win7 тем простым способом, что я писал
F>Две такие свои программы сам у себя же и использую уже года четыре. И вот честно говоря не помню, чтобы не появилась у них иконка (конечно же, мог не обратить внимания). ОДна программа запускается через Run ключ реестра, другая — через виндовый шедулер.
F>И мне сильно интересно, если и в самом деле есть какой косяк, а я просто его не замечал.
Регулярный это косяк. Хотя я не уверен что дело исключительно в Windows... Тут может быть еще и сторонние поделки помогают, вроде антивирей со своими песочницами (не проверял, просто на вскидку предположение, исключительно из моей ситуации). Но только пользователю от этого не легче. Иконки нет.
F>С другой стороны, у меня еще автостартует proxess explorer, так вот его икона в трее иногда может не появиться.

Тот самый случай между прочим. Я за PE тоже что-то такое видел. И главное, по предположениям сходится).
Aml Pages Home
Re[4]: Проверить/отловить доступность TaskBar - как?
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.12.12 00:11
Оценка:
C>Угу, но только если таскбар уже создан, и программа в автозапуске стартует несколько после его инициализации — то так до скончания веков и можно прождать сообщения "TaskbarCreated" — не вариант.

Это не так. Все, что надо — на WM_CREATE перед созданием иконки _сначала_ зарегистрировать сообщение, а затем поискать Shell_TrayWnd. Если найдено — идти регистрировать, добавление в этом случае вернет ошибку только если действительно проблемы у эксплорера, но тогда ждать бессмысленно.


PS Я смотрю, вы не ищете простых путей решения задач, да...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 14.12.12 21:03
Оценка:
AS>Код и условия воспроизведения в студию. Пенисометрией у кого больше кода и где работает я заниматься не собираюсь — это неконструктивно. Жалоб на вариант c регистрацией сообщения + FindWindow не было.
...
class CAutoLastError {
private:
    void* operator new(size_t);
    const DWORD m_dwPrevError;
public:
    CAutoLastError():m_dwPrevError(::GetLastError())
    {
        SetLastError(0);
    }
    ~CAutoLastError()
    {
        SetLastError(m_dwPrevError);
    }
};
//...
BOOL CWndForTray::Install2TrayInternal(const BOOL bModifyOrAdd
                                       , const BOOL bShowInfoBallon
                                       , LPCTSTR lpszAddTextToBallon)
{
//...
    NOTIFYICONDATA ni={0};
    ni.cbSize=sizeof(ni);
//...
    ni.uCallbackMessage=GetTrayMessage();
    ni.uFlags=NIF_TIP|NIF_MESSAGE|NIF_ICON;
//...
    const BOOL b=Shell_NotifyIcon(bModifyOrAdd ? NIM_MODIFY : NIM_ADD,&ni);
    return b;
}

//...

//вот она сия фунция с лог-репортом в файл, остальное выше исключительно для ясности привел
BOOL CWndForTray::Install2Tray(const BOOL bShowInfoBallon)
{
    const BOOL bFindTray=(NULL != FindWindowEx(NULL,NULL,TEXT("Shell_TrayWnd"),NULL));
    const CAutoLastError le;//обнуление ошибки
    const BOOL bRet=Install2TrayInternal(FALSE/*FALSE - for NIM_ADD, TRUE for NIM_MODIFY*/,bShowInfoBallon,NULL);
    
    if (!bRet) {        
        CString strLog;
        strLog.Format(TEXT("Cannot install tray icon. Last Error: %d, TrayWindow Is Finded=%d"),GetLastError(),bFindTray);
        CLogReportToFile::WriteLog(strLog);
    }

    return bRet;
}

Условия простые. Именно на автостарте софтины с виндой иногда не показывается иконка в трее.
1) Именно на автостарте — пущаем ручками, ясное дело все ок. Думаю, автостарт важно — у многих куча дряни грузится и у меня также от антивиря до всякой мелочи. Поэтому явно системе походу есть чем заняться в этот момент. Соответственно и код ошибки говорящий ERROR_TIMEOUT...

2) Проект живой. Есть соседний проект схожий по условиям (тулза в автостарте, иконка в трей). Но там другой код. А подобная проблема, что иконка иногда не ставится в трей при запуске, точно так же проявлялась ни по разу.

3) Такая же ситуация с "пропажей" (не-установкой) иконки в автостарте много где проявляется и в чужом софте. TrayIt к примеру часто не проявляется, FlashPaste не проявляется иногда. Так что на кривость исключительно своих рук валить не приходится.

И потом. Как говорил выше. Ну а если завтра MS сменит имя класса окна с ShellTrayWnd на другое? Что тогда? Код перестанет работать. (это нормально — никто не документировал и не клялся по жизни не изменять имена классов окон). А такое бывало. Подробности не помню, но в старых виндах к примеру, панель вкладок (Taskbar) это именно TabCtrl, а вот в поновее версиях (не помню, ни то 2К, ни то с XP) — это Toolbar. Это как иллюстрацию привожу. Когда деваться некуда, можно конечно использовать и имена классов. Но если есть способ и надежнее, зачем?
Aml Pages Home
Re[8]: Проверить/отловить доступность TaskBar - как?
От: Andrew S Россия http://alchemy-lab.com
Дата: 14.12.12 22:28
Оценка:
C>Условия простые. Именно на автостарте софтины с виндой иногда не показывается иконка в трее.
C>1) Именно на автостарте — пущаем ручками, ясное дело все ок. Думаю, автостарт важно — у многих куча дряни грузится и у меня также от антивиря до всякой мелочи. Поэтому явно системе походу есть чем заняться в этот момент. Соответственно и код ошибки говорящий ERROR_TIMEOUT...

На какой системе воспроизводится (берем _чистую_ систему)?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[9]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 15.12.12 09:01
Оценка:
Здравствуйте, Andrew S, Вы писали:

C>>Условия простые. Именно на автостарте софтины с виндой иногда не показывается иконка в трее.

C>>1) Именно на автостарте — пущаем ручками, ясное дело все ок. Думаю, автостарт важно — у многих куча дряни грузится и у меня также от антивиря до всякой мелочи. Поэтому явно системе походу есть чем заняться в этот момент. Соответственно и код ошибки говорящий ERROR_TIMEOUT...

AS>На какой системе воспроизводится (берем _чистую_ систему)?

XP SP3.
Aml Pages Home
Re[10]: Проверить/отловить доступность TaskBar - как?
От: BurningInside Россия  
Дата: 15.12.12 10:01
Оценка:
А у меня комп не выключается, спящий/ждущий режим. Случайно узнал об это проблеме. Перегружаю редко, пару раз замечал, что иконок у программ нет, не понял из-за чего. А тут ставил кучу обновлений с множеством перезагрузок и разул глаза.
Re[11]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 15.12.12 10:46
Оценка:
Здравствуйте, BurningInside, Вы писали:

BI>А у меня комп не выключается, спящий/ждущий режим. Случайно узнал об это проблеме. Перегружаю редко, пару раз замечал, что иконок у программ нет, не понял из-за чего. А тут ставил кучу обновлений с множеством перезагрузок и разул глаза.


Проблема много где проявляется. В немалой куче стороннего софта. А неудобно сильно. Прям хоть какую тулзу написать, чтобы в соседних программах правила сие дело.
Aml Pages Home
Re[8]: Проверить/отловить доступность TaskBar - как?
От: okman Беларусь https://searchinform.ru/
Дата: 15.12.12 11:25
Оценка:
Здравствуйте, Carc, Вы писали:

C>Все просто: к моменту старта софтины тескбар уже создан, и соответственно рассылать сообщение "TaskBarCreated" он уже больше не будет. Т.к. уже создан. А мои две софтины, стоящие в автостарте судя по всему попадают где-то в промежуток. Т.е. они попросту не успевают получить TaskBarCreated, именно потому что они подписываются на его получение (пущают свою WndProc несколько позже). Соответственно дожидаться больше нечего. Таскбар есть, сообщение больше рассылаться не будет. Полагаться на поиски через FindWindow в те еще прятки играть с Microsoft. Завтра они что-нить переименуют в классах окна, и код нерабочим становится. Остается только полагаться на Shell_NotifyIcon + NIM_ADD.


А нельзя ли поступить проще ?
Ведь задача состоит лишь в том, чтобы:

1. Гарантированно запостить свою иконку в трей при автозагрузке.
2. Сделать это заново при возможном перезапуске оболочки.

Пункт 1 успешно решается вызовом Shell_NotifyIcon в цикле с некоторой задержкой,
до тех пор, пока функция не вернет TRUE. Например, по WM_TIMER.

Пункт 2 решается подпиской на сообщение TaskbarCreated и снова запуском Shell_NotifyIcon в цикле.

Уверен, что так будет работать.

P.S.
Кстати, в Windows 7 юзать трей уже не модно — там есть ITaskbarList3 и т.п.
И там аналогичные проблемы с отловом запуска/перезапуска таскбара — "TaskbarButtonCreated".
Re[9]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 15.12.12 11:58
Оценка:
Здравствуйте, okman, Вы писали:

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


C>>Все просто: к моменту старта софтины тескбар уже создан, и соответственно рассылать сообщение "TaskBarCreated" он уже больше не будет. Т.к. уже создан. А мои две софтины, стоящие в автостарте судя по всему попадают где-то в промежуток. Т.е. они попросту не успевают получить TaskBarCreated, именно потому что они подписываются на его получение (пущают свою WndProc несколько позже). Соответственно дожидаться больше нечего. Таскбар есть, сообщение больше рассылаться не будет. Полагаться на поиски через FindWindow в те еще прятки играть с Microsoft. Завтра они что-нить переименуют в классах окна, и код нерабочим становится. Остается только полагаться на Shell_NotifyIcon + NIM_ADD.


O>А нельзя ли поступить проще ?

O>Ведь задача состоит лишь в том, чтобы:

O>1. Гарантированно запостить свою иконку в трей при автозагрузке.

Именно об этом и речь.
O>2. Сделать это заново при возможном перезапуске оболочки.
Это не обсуждалось. Ибо несколько другая задача (это само собой сделано, ясен пень, но не решает п.1)

O>Пункт 1 успешно решается вызовом Shell_NotifyIcon в цикле с некоторой задержкой,

O>до тех пор, пока функция не вернет TRUE. Например, по WM_TIMER.
Чуток иначе сделал, через фоновый поток
Автор: Carc
Дата: 28.11.12
. Но в том случае пофиг было. Т.к. фоновых потоков и так хватало в софтине, и они синхронизировались с гуи-потоком по любому. Так что лишний поток проблемы не создавал. Болтается в фоне, поспит-поспит — попросит гуёвый поток еще раз тыркнуться в трей. Прошло — отлично. Не прошло — еще поспит.

>P.S.

O>Кстати, в Windows 7 юзать трей уже не модно — там есть ITaskbarList3 и т.п.
Не уловил... А чем ITaskbarList3 решает\улучшает работу с треем? Почему "не модно"? Используют что-то другое?
O>И там аналогичные проблемы с отловом запуска/перезапуска таскбара — "TaskbarButtonCreated".
Aml Pages Home
Re[10]: Проверить/отловить доступность TaskBar - как?
От: okman Беларусь https://searchinform.ru/
Дата: 15.12.12 12:30
Оценка:
Здравствуйте, Carc, Вы писали:

C>А чем ITaskbarList3 решает\улучшает работу с треем? Почему "не модно"? Используют что-то другое?


По сравнению с треевой иконкой кнопка на таскбаре — более управляемое и в некоторых случаях более
наглядное в визуальном плане средство. Туда можно и оверлейную иконку впихнуть поверх основной, и
индикатор прогесса, и thumbnail, и кнопки. Жаль, что это работает только с Windows 7 и выше.
Re[10]: Проверить/отловить доступность TaskBar - как?
От: okman Беларусь https://searchinform.ru/
Дата: 15.12.12 12:37
Оценка:
Здравствуйте, Carc.

Забыл добавить, и это чуть ли не самое главное.
В Vista и выше все эти иконки по умолчанию скрыты в маленьком меню в трее,
если только пользователь явно не включит их в настройках меню "Пуск".
То есть, в общем случае, если надо пользователю о чем-то срочно моргнуть, иконка уже не подходит.
Re[12]: Проверить/отловить доступность TaskBar - как?
От: CEMb  
Дата: 17.12.12 06:00
Оценка:
Здравствуйте, Carc, Вы писали:

BI>>А у меня комп не выключается, спящий/ждущий режим. Случайно узнал об это проблеме. Перегружаю редко, пару раз замечал, что иконок у программ нет, не понял из-за чего. А тут ставил кучу обновлений с множеством перезагрузок и разул глаза.


C>Проблема много где проявляется. В немалой куче стороннего софта. А неудобно сильно. Прям хоть какую тулзу написать, чтобы в соседних программах правила сие дело.


Хорошая идея, кстати, и реализуется не сильно сложно Другое дело, что КПД у неё будет низкий.

Btw, я тут тоже решил покакать в ваш уютный вентилятор, и вспомнил, что у меня такая проблема была тоже, когда я встраивался в окно таскбара, мой код начинал собирать данные из системы по старту, подсаживал ShellTrayWnd, а за ним и explorer, одновременно я звал вставку иконки в трей. Всё это дело стабильно замирало на несколько секунд, вешая друг друга, что было вообще недопустимо для программы, которая должна вроде как наоборот ускорять и помогать. Проблему, помтится, решил, сделав под установку иконки отдельный сред. Регистрация-отслеживание сообщения всё равно надо, потому что таскбар может сдохнуть и заново родиться, тогда надо будет опять перевставиться, чего 50-60% программ, по моему наблюдению, не делают (и мои некоторые тоже), и приходится их искать спайем и выдёргивать в видимость
Re[13]: Проверить/отловить доступность TaskBar - как?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 17.12.12 09:25
Оценка:
Здравствуйте, CEMb, Вы писали:

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


BI>>>А у меня комп не выключается, спящий/ждущий режим. Случайно узнал об это проблеме. Перегружаю редко, пару раз замечал, что иконок у программ нет, не понял из-за чего. А тут ставил кучу обновлений с множеством перезагрузок и разул глаза.


C>>Проблема много где проявляется. В немалой куче стороннего софта. А неудобно сильно. Прям хоть какую тулзу написать, чтобы в соседних программах правила сие дело.


CEM>Хорошая идея, кстати, и реализуется не сильно сложно Другое дело, что КПД у неё будет низкий.


CEM>Btw, я тут тоже решил покакать в ваш уютный вентилятор, и вспомнил, что у меня такая проблема была тоже, когда я встраивался в окно таскбара, мой код начинал собирать данные из системы по старту, подсаживал ShellTrayWnd, а за ним и explorer, одновременно я звал вставку иконки в трей. Всё это дело стабильно замирало на несколько секунд, вешая друг друга, что было вообще недопустимо для программы, которая должна вроде как наоборот ускорять и помогать. Проблему, помтится, решил, сделав под установку иконки отдельный сред. Регистрация-отслеживание сообщения всё равно надо, потому что таскбар может сдохнуть и заново родиться, тогда надо будет опять перевставиться, чего 50-60% программ, по моему наблюдению, не делают (и мои некоторые тоже), и приходится их искать спайем и выдёргивать в видимость

Сообщение сообщением — это само собой разумеется. Просто это другой use-case: "был-жил таскбар до добра наживал, да вдруг померъ"...

Поток я заводил в своем случае вместо WM_TIMER как советовал omonim, исключительно из архитектурных соображений. Та самая тулза писана на чистом WinAPI, поэтому там хоть и пара классов для удобства разработки, но все равно все сводится к мрачному switch-case в WindowProc. Поэтому лазить в нее с правками совсем скучно. Куда как проще было воткнуть поток, который по своему коду будет практически автономен.

С той лишь разницей, что у меня этот фоновый поток не сам ставил иконку, а дергал через SendMessage+WM_APP+xxx основной — чтобы тот еще раз попытался воткнуться в трей. А уж основной поток знал, надо-не-надо, что вернуть в случае успеха и.т.д. В общем исключительно вопрос инкапсуляции и только.

Плюс вопросов синхронизации потоков вообще не возникало. В той софтине фоновых потоков уже хватает, которые чего-то там в фоне готовят_данные\делают\пасут_изменения_настроек\и_прочия_и_прочия. Поэтому синхронизация уже давным-давно вылизана до идеала. Поэтому, как не забавно, добавить поток и синхронизовать его это буквально пара строк, чем мутить код в switch\case в WindowProc...

Проще говоря, не настаиваю на правильности отдельного потока. Идея исключительно в том, чтобы отложить(+может быть потоврить) Shell_NotifyIcon+NIM_ADD. А уж как это делать, через поток, через таймер или еще как — вопрос исключительно конкретики.
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.