forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Delphi (http://forum.boolean.name/forumdisplay.php?f=66)
-   -   Работа с треем (http://forum.boolean.name/showthread.php?t=13567)

Trazzy 23.10.2010 08:12

Работа с треем
 
Требуется достать из трея (ХР) иконки и работать с ними..
(эмулировать работу трея или как это называется)
Google не помог..
У кого есть какие соображения по данному вопросу? Есть спецы?
__________________
Upd:
Что никто не поможет разобраться?

Trazzy 24.10.2010 05:25

Ответ: Работа с треем
 
Пока нашел только это:
Цитата:

Чужие идеи:

Вариант 1:
Можно сделать обёртку над shell32.dll, реализовав нужные мне функции работы с треем самому, а остальные перенаправлять в оригинальную

Вариант 2:
Может просто окно трея себе перекинуть? Делается простой сменой родителя.

Вариант 3:
1. зарегистрировать класс TrayNotifyWnd и создать такое окно.
2. разослать всем окнам сообщение TaskbarCreated, чтобы они перерегистрировались в трее
3. отслеживать сообщение WM_COPYDATA. С его помощью передаются структуры SHELLAPPBARDATA (COPYDATASTRUCT::data — 0) и SHELLTRAYDATA (COPYDATASTRUCT::data — 1).

Код:

typedef struct _SHELLTRAYDATA
{
    DWORD dwHz;
    DWORD dwMessage;
    NOTIFYICONDATA nid;
} SHELLTRAYDATA;


__________________
Upd:
также имеются сорцы LiteStep, только они написаны на си:user::mad:

Trazzy 14.11.2010 07:18

Ответ: Работа с треем
 
Вложений: 1
Не дождавшись помощи от булки я забил на это дело,
но чуть позже все-таки решил заняться этим вплотную..
(написанием аналога XP'шного таскбара
и это скорее из-за спортивного интереса)..

Вот что мне удалось сделать на данный момент:

- одноразовое считывание иконок *
- реагирование на нажатие левой/правой клавиши мыши
- подмена таскбара
- эмулирование нажатия кнопки "Пуск" **

Пример приложения в архиве.. (делалось на основе "3 варианта")
Поделюсь исходниками с человеком, который поможет довести все это до ума!

** во время выполнения программы не обновляются! (+функция почему-то не корректно работает; отображаются не все значки)
** частичное

baton4ik 14.11.2010 13:11

Ответ: Работа с треем
 
хм. Двойное нажатие не работает. Сразу появилось 3 иконки нода и каждую секунду добавлялась ещё одна. Эмуляция пуска не работает. И самое важное:
Какого хрена после запуска твой трей убирает нативный, а перед закрытием не возвращает обратно?

Trazzy 14.11.2010 23:21

Ответ: Работа с треем
 
Проверил на нескольких компах и обнаружил, что программа не всегда правильно себя ведет... ((
Хотя на моем работает нормально ..

2 baton4ik: у тебя ХР? (какой sp?..)

> Двойное нажатие не работает.
Странно, ведь функция DblClick имеется и должна работать..
Особого внимания этому не придавал.. Посмотрим....


> Сразу появилось 3 иконки нода и каждую секунду добавлялась ещё одна.
Такое поведение я заметил у программ, которые регулярно
обновляют свои иконки.. Пока еще думаю как исправить..


> Эмуляция пуска не работает.
Было два варианта как открыть "Пуск"; не лепить же мне 2 кнопки..
Значит попробуем второй!.


> Какого хрена после запуска твой трей убирает нативный, а перед закрытием не возвращает обратно?
Хм.. по идее такого быть не должно....
Каким образом ты закрываешь программу?

PHP код:

// При старте программы вызывается 
ShowWindow(FindWindow('Shell_TrayWnd'nil), SW_HIDE);
// А на кнопке "Выход" и в "FormDestroy" стоит - 
ShowWindow(FindWindow('Shell_TrayWnd'nil), SW_SHOW);

// может стоит попробовать использовать
// SW_SHOWNORMAL вместо SW_SHOW ?? 


baton4ik 14.11.2010 23:24

Ответ: Работа с треем
 
Windows 7. Закрыл по ПКМ->Выход

Trazzy 14.11.2010 23:41

Ответ: Работа с треем
 
Пост #3:
Цитата:

Сообщение от 2Fake (Сообщение 168609)
...
все-таки решил заняться этим вплотную..
(написанием аналога XP'шного таскбара
...


baton4ik 15.11.2010 00:06

Ответ: Работа с треем
 
Я видел. Это не значит, что он не должен работать на 7ке

Trazzy 15.11.2010 01:12

Ответ: Работа с треем
 
Помимо своего компьютера (XP-sp3) проверял еще на 2х (XP-sp2, XP-sp3)//
..и на всех из них после закрытия приложения корректно восстанавливался таскбар..
хз почему на семерке не работает..
Не могу о ней ничего сказать, т.к раньше не вникал в тонкости этой оси ..

Trazzy 17.11.2010 09:58

Ответ: Работа с треем
 
Вложений: 2
Повозился еще немного с кодом:

- пофиксена эмуляция нажатия на кнопку "Пуск";
- по двойному клику на часики открывается апплет настроек даты/времени;
- подправлен код, восстанавливающий "нативную" пенель задач после выхода..
(на других системах еще не тестировал)
- добавлено немного оформления;
- исправлено несколько мелких багов..

Со значками трея пока не разбирался, осталось как раньше.
Что на сей раз скажете?

baton4ik 17.11.2010 18:57

Ответ: Работа с треем
 
Теперь всё ок. Вот только если открыть контекстное меню элемента с лотке, а потом открыть контекстное меню другого элемента, первое не пропадёт. И они вообще не пропадут, пока ты не выберешь какой-либо пункт в меню.
И дефолтный таскбар, я смотрю, ты вообще не скрываешь. Твой таскбар был легко свёрнут нажатием по "Свернуть все окна", так как фокус поместился на дефолтный таскбар

Trazzy 17.11.2010 20:53

Ответ: Работа с треем
 
Цитата:

Сообщение от baton4ik (Сообщение 169049)
Теперь всё ок. Вот только если открыть контекстное меню элемента с лотке, а потом открыть контекстное меню другого элемента, первое не пропадёт. И они вообще не пропадут, пока ты не выберешь какой-либо пункт в меню...

Да, я знаю. Но уже хоть как-то работает, чем вобще никак.
Плюс ко всему этому отображаются не все значки и некоторые выводят значок программы поместившей иконку вмето самой иконки.
С эмуляцией трея толком еще не разборался. Нет такого человека кто бы помог с этим, а то одному уж слишком напряжно.

Цитата:

Сообщение от baton4ik (Сообщение 169049)
... И дефолтный таскбар, я смотрю, ты вообще не скрываешь. Твой таскбар был легко свёрнут нажатием по "Свернуть все окна", так как фокус поместился на дефолтный таскбар

Панель задач убирается с экрана способом, который я описал в посте #5
(окно просто скрывается по sw_hide, но остается активным)

fall 12.12.2010 14:12

Ответ: Работа с треем
 
А не дурно ведь, очень даже! 2Fake, а кодом поделитесь?
По поводу меню есть идея. У меня была похожая проблемма. Его нужно выводить с с помощью примерно такого кода:
PHP код:

SetForegroundWindow(Handle);
TrackPopupMenu(PopupMenu1TPM_LEFTBUTTONp.xp.y0,HandleNIL);
PostMessage(HandleWM_NULL00); 


Trazzy 14.12.2010 02:16

Ответ: Работа с треем
 
Сообщение от fall А не дурно ведь, очень даже! 2Fake, а кодом поделитесь?
стучи в асю, поговорим..
а если мне больше ничего не удастся сделать -
возможно скоро выложу исходник..

UPD:
Сообщение от fall TrackPopupMenu(PopupMenu1, TPM_LEFTBUTTON, p.x, p.y, 0,Handle, NIL);
У меня немного иначе вызывается контекстное меню,
но SetForegroundWindow(Handle); и PostMessage(Handle, WM_NULL, 0, 0); действительно помогли)) Огромное спасибо!

fall 14.12.2010 13:26

Ответ: Работа с треем
 
>>действительно помогли)) Огромное спасибо!
Пожалуйсто. Впервые я стал полезен кому-то на форуме :)
Много чего интерестного для этой программы можно почерпнуть из исходников blackbox (bb4win.com). Это панель задач, которая полностью заменяет стандартную. Исходный код открыт, но он собирается на CygWin (С++) а не на Delphi...
Подкину идейку. Вашей программе не хватает обрезки WorkArea, ну, чтобы при разворачивании окна других программ не залетали под zTrayBar. Копайте в сторону SPI_SETWORKAREA

Trazzy 18.12.2010 02:01

Ответ: Работа с треем
 
Сообщение от fall ..Впервые я стал полезен кому-то на форуме..
Так держать! :)

Сообщение от fall ..можно почерпнуть из исходников blackbox (bb4win.com)..
Не только из blackbox, есть еще масса таких же: LiteStep, GeoShell и пр.
Но проблема в том что все они написаны на Си, с которым я ни-ни

Сообщение от fall ..не хватает обрезки WorkArea.. Копайте в сторону SPI_SETWORKAREA..
А теперь поподробней с этого момента))

Trazzy 18.12.2010 04:56

Ответ: Работа с треем
 
Сообщение от fall ..при разворачивании окна других программ не залетали под zTrayBar zTaskBar..
Сделал! Теперь вопрос: возможно ли как-то перерегистрировать все развернутые окна и программы,
чтобы они изменили свои размеры под текущую клиентскую область?!...

fall 20.12.2010 22:01

Ответ: Работа с треем
 
Цитата:

возможно ли как-то перерегистрировать все развернутые окна и программы,
чтобы они изменили свои размеры под текущую клиентскую область?!...
Я бы об этом не беспокоился пока что, мелочи...
А вот что иконки не обновляются в трее, это проблема. Как я понял, программа обрабатывает только сообщения NIM_ADD, а ведь есть еще NIM_MODIFY и NIM_DELETE и парочку еще, например которые текст всплывающей подсказки над иконкой присылают.

Trazzy 21.12.2010 04:08

Ответ: Работа с треем
 
Вложений: 1
Да, трей - самое трудное!..

Сообщение от fall ..вот что иконки не обновляются в трее, это проблема..
см. внимательней пост #3: увы пока только это...

Сообщение от fall ..ведь есть еще NIM_MODIFY и NIM_DELETE и парочку еще..
Я в курсе :) но с ними некоторые траблы,
т.к это чужие иконки, а не те, что сами добавили))
Как редактировать первый пост?!..

2All: Протестируйте проектик из аттача и отпишитесь все ли иконки трея отображаются и правильное ли у них состояние (Отображена/Отключена/Скрыта)..

fall 21.12.2010 21:52

Ответ: Работа с треем
 
У меня просто пустой список. WinXP + blackbox.
Уверен, будет проблема вывести иконку заряда батареи (на ноутах). Потому что эти функции нужно писать самому.
А еще иконка сети, хрен поймешь откуда она берется. На форуме bb4win один умелец это реализовал.

Trazzy 22.12.2010 01:37

Ответ: Работа с треем
 
Сообщение от fall У меня просто пустой список. WinXP + blackbox.
Подозреваю, что это из-за Blackbox.

Интересно услышать отзывы других ХР-булочников!..:)

Сообщение от fall ..проблема вывести иконку заряда батареи (на ноутах)..
Возможно. Не проверял..
Дружище, ты асей пользуешься?.

Сообщение от fall ..А еще иконка сети, хрен поймешь откуда она берется..
Она должна отображаться в проге из поста #19..
(по крайней мере у меня показалась)

fall 22.12.2010 16:32

Ответ: Работа с треем
 
Цитата:

Дружище, ты асей пользуешься?.
Общение в ICQ лишает свободного времени (и рабочего) :)
Пиши на 374399318, но не обещаю что смогу оперативно ответить.

Цитата:

Она должна отображаться в проге из поста #19..
(по крайней мере у меня показалась)
Ну, у меня там вообще ничего нет...
Вероятно, когда пользователь заменит explorer.exe на эту оболочку, у него будет тоже самое.

Trazzy 23.12.2010 20:56

Ответ: Работа с треем
 
Сообщение от fall ..когда пользователь заменит explorer.exe на эту оболочку, у него будет тоже самое..
Понятное дело!. В последнем примере иконки считываются прямо с трея (ToolbarWindow32)
Тем более я не собираюсь делать весь shell.. Пока только таскбар.

Вот, кому интересно:
PHP код:

Shell_TrayWnd
  
|- Button (Пуск)
  |- 
ReBarWindow32
  
|    |- MSTaskSwWClass
  
|    |    +- ToolbarWindow32
  
|    +- ToolbarWindow32
  
+- TrayNotifyWnd
       
|- TrayClockWClass (там где часики)
       |- 
SysPager
       
|    +- ToolbarWindow32 (это наши иконки)
       +- 
Button 



Часовой пояс GMT +4, время: 15:13.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot