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


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

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