Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Delphi

Ответ
 
Опции темы
Старый 23.10.2010, 08:12   #1
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Работа с треем

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

Последний раз редактировалось Trazzy, 24.10.2010 в 08:25. Причина: (см. upd)
(Offline)
 
Ответить с цитированием
Старый 24.10.2010, 05:25   #2
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

Пока нашел только это:
Чужие идеи:

Вариант 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, только они написаны на си
__________________
Уважай собеседника, а лучше подари ему +

Последний раз редактировалось Trazzy, 24.10.2010 в 08:29. Причина: (см. upd)
(Offline)
 
Ответить с цитированием
Старый 14.11.2010, 07:18   #3
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

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

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

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

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

** во время выполнения программы не обновляются! (+функция почему-то не корректно работает; отображаются не все значки)
** частичное
Вложения
Тип файла: zip DemoTray.zip (204.1 Кб, 747 просмотров)
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 14.11.2010, 13:11   #4
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Работа с треем

хм. Двойное нажатие не работает. Сразу появилось 3 иконки нода и каждую секунду добавлялась ещё одна. Эмуляция пуска не работает. И самое важное:
Какого хрена после запуска твой трей убирает нативный, а перед закрытием не возвращает обратно?
(Offline)
 
Ответить с цитированием
Старый 14.11.2010, 23:21   #5
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

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

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

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


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


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


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

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

// может стоит попробовать использовать
// SW_SHOWNORMAL вместо SW_SHOW ?? 
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 14.11.2010, 23:24   #6
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Работа с треем

Windows 7. Закрыл по ПКМ->Выход
(Offline)
 
Ответить с цитированием
Старый 14.11.2010, 23:41   #7
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

Пост #3:
Сообщение от 2Fake Посмотреть сообщение
...
все-таки решил заняться этим вплотную..
(написанием аналога XP'шного таскбара
...
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 15.11.2010, 00:06   #8
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Работа с треем

Я видел. Это не значит, что он не должен работать на 7ке
(Offline)
 
Ответить с цитированием
Старый 15.11.2010, 01:12   #9
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

Помимо своего компьютера (XP-sp3) проверял еще на 2х (XP-sp2, XP-sp3)//
..и на всех из них после закрытия приложения корректно восстанавливался таскбар..
хз почему на семерке не работает..
Не могу о ней ничего сказать, т.к раньше не вникал в тонкости этой оси ..
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 17.11.2010, 09:58   #10
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

Повозился еще немного с кодом:

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

Со значками трея пока не разбирался, осталось как раньше.
Что на сей раз скажете?
Миниатюры
Нажмите на изображение для увеличения
Название: zTB_screenshot.png
Просмотров: 1063
Размер:	85.3 Кб
ID:	11842  
Вложения
Тип файла: zip zTaskBar.zip (210.7 Кб, 751 просмотров)
__________________
Уважай собеседника, а лучше подари ему +

Последний раз редактировалось Trazzy, 17.11.2010 в 22:21. Причина: добавлен скриншот
(Offline)
 
Ответить с цитированием
Старый 17.11.2010, 18:57   #11
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Работа с треем

Теперь всё ок. Вот только если открыть контекстное меню элемента с лотке, а потом открыть контекстное меню другого элемента, первое не пропадёт. И они вообще не пропадут, пока ты не выберешь какой-либо пункт в меню.
И дефолтный таскбар, я смотрю, ты вообще не скрываешь. Твой таскбар был легко свёрнут нажатием по "Свернуть все окна", так как фокус поместился на дефолтный таскбар
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Trazzy (04.12.2010)
Старый 17.11.2010, 20:53   #12
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

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

Сообщение от baton4ik Посмотреть сообщение
... И дефолтный таскбар, я смотрю, ты вообще не скрываешь. Твой таскбар был легко свёрнут нажатием по "Свернуть все окна", так как фокус поместился на дефолтный таскбар
Панель задач убирается с экрана способом, который я описал в посте #5
(окно просто скрывается по sw_hide, но остается активным)
__________________
Уважай собеседника, а лучше подари ему +
(Offline)
 
Ответить с цитированием
Старый 12.12.2010, 14:12   #13
fall
Оператор ЭВМ
 
Регистрация: 08.12.2010
Адрес: Белорусь
Сообщений: 25
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Работа с треем

А не дурно ведь, очень даже! 2Fake, а кодом поделитесь?
По поводу меню есть идея. У меня была похожая проблемма. Его нужно выводить с с помощью примерно такого кода:
SetForegroundWindow(Handle);
TrackPopupMenu(PopupMenu1TPM_LEFTBUTTONp.xp.y0,HandleNIL);
PostMessage(HandleWM_NULL00); 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Trazzy (14.12.2010)
Старый 14.12.2010, 02:16   #14
Trazzy
Разработчик
 
Аватар для Trazzy
 
Регистрация: 24.11.2008
Адрес: UA
Сообщений: 504
Написано 110 полезных сообщений
(для 225 пользователей)
Ответ: Работа с треем

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

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

Последний раз редактировалось Trazzy, 14.12.2010 в 06:14. Причина: (см. upd)
(Offline)
 
Ответить с цитированием
Старый 14.12.2010, 13:26   #15
fall
Оператор ЭВМ
 
Регистрация: 08.12.2010
Адрес: Белорусь
Сообщений: 25
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Работа с треем

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com