Перейти к содержанию
Fire Monkey от А до Я

[Windows] TnTRayIcon не визуальный компонент обеспечивающий управление значком в области System Tray


Рекомендуемые сообщения

Набросал компонент для работы с значком в системном трее. Компонент только для FM и только для платформы Windows ! Среда: Delphi XE6 

 

Основные моменты

 

Свойства:

  • Hint : string - отображает текст при наведении на значок в системном трее
  • BalloonTitle : string - текст заголовка всплывающей подсказки
  • BalloonText : string - текст содержания всплывающей подсказки
  • IconBalloonTypeTBalloonIconType - иконка всплывающей подсказки. Принимает значения: ​​​BigError, BigWarning, Error, Info, None, User, Warning
  • Indent : Cardinal - "косметический костыль" для нормального отображения меню при клике по значку в системном трее. Подбирается экспериментально, так как при различных стилях область отображения меню изменяется (меню уезжает вверх)
  • PopUpMenu : TPopUpMenu - всплывающее меню, при OnClick правой кнопкой мыши по значку

​Методы:

  • Show - отображать значок в системном трее
  • Hide - скрыть значок из системного трея
  • ShowBalloonHint - показать всплывающую подсказку

События:

  • OnClick - нажатие левой кнопки мыши
  • OnDblClick - двойное нажатие левой кнопки мыши

Важное замечание: необходимо обязательное наличие TForm и только один экземпляр TnTrayIcon в приложении !

 

Установка:

  1. Распаковать содержимое архива
  2. Открыть файл nTrayIcon.dpk
  3. В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Compile
  4. В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Install
  5. Добавляем путь в Library: Tools -> Options -> Delphi Options -> Library -> Library Patch -> Add...

В архиве компонент и пример для работы.

 

P.S. Писал для себя, так как частенько использую... Всегда хочется простоты.

P.S.S. Писал быстро и ночью. Возможны недочеты и ошибки. Постепенно исправлю.

TnTrayIcon.zip

Ссылка на комментарий

Молодец, спасибо, если "допиливать" будешь, добавь возможность отображения по мимо hint'a, формы( в type's параметр закатай, там sform,shide), и какой, а дальше  присваиваем форму. Высчитываем % соотношения к рабочему столу, далее при show плавный opacity к 1единице, так-же при исчезание(после задержки, или же после MouseOver) opacity к 0-лю.... и hide. Как руки дойдут, сам реализую... если у тебя быстрее, то милости просим))

Ссылка на комментарий

А смысл таких "изворотов" с формой, как альтернативой Hints ? Для моих целей вполне достаточно стандартного меню, единственное, что необходимо "допилить":

  • Определение позиции TaskBar (так как он у пользователя бывает не только снизу) для корректного отображения меню
  • Различные манипуляции с иконкой в трее (смена и т.д.)
  • Кастомный BalloonHint

В принципе мне более и не надо

 

P.S. как показывает практика - пользователь все равно нажмет на иконку в трее для получения информации о состоянии (работы) приложения...

Ссылка на комментарий
  • 2 месяца спустя...

Пару заметок:

Меню показывается за таскбаром, а не поверх него.

Если включить прозрачность у формы, при запуске иконка в трее показывается и сразу же пропадает.

P.S.WIndows 8.1

Ссылка на комментарий

Если меню оказалось за таскбаром, поиграйтесь с свойством Indent

Причем тут Indent? если речь идет о другом... объясню на примере

ffa6e2f86343564f2493037114f8ab17.jpg

Сделал для себя временное решение:

if Screen.MousePos..Y < VCL.Forms.Screen.WorkAreaTop then
  PopUpMenu1.Popup(Screen.MousePos.X;, VCL.Forms.Screen.WorkAreaTop)
else
  PopUpMenu1.PopUp(Screen.MousePos.X;, Screen.MousePos..Y);

Но как вы понимаете это не решает той проблемы что сейчас.

 

И еще, пока проблема с исчезновение иконки у прозрачной формы не решится, этот компонент бесполезен, по крайней мере для меня, но я все ровно буду искать способ решить эту проблему .

Ссылка на комментарий

Ident задает смещение, что значит причем ? если у Вас таскбар расположен сверху, то ident должен иметь отрицательное значение, к примеру -NN

Этот компонент написан на скорую руку. Хотите модернизировать - все Вам скажут спасибо. Добавьте функцию определения позиции таскбара, к примеру. Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром. В FM это сделать не легко.

Ссылка на комментарий

Ident задает смещение, что значит причем ? если у Вас таскбар расположен сверху, то ident должен иметь отрицательное значение, к примеру -NN

Этот компонент написан на скорую руку. Хотите модернизировать - все Вам скажут спасибо. Добавьте функцию определения позиции таскбара, к примеру. Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром. В FM это сделать не легко.

Блин, положение меню по оси y, и положение меню как "слой" так сказать это разные вещи.
Ссылка на комментарий

Вы за кого меня принимаете ? Посмотрите на досуге исходники FM, если они у Вас есть... Еще раз повторюсь "Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром" т.е. на границе TaskBar и WorkArea.

 

P.S. что за ось Z ? Мы работаем в плоскости, где только 2 направляющие X,Y

Ссылка на комментарий

P.S. что за ось Z ? Мы работаем в плоскости, где только 2 направляющие X,Y

Вот только не надо к словам придираться, опечатался, с кем не бывает...

Вы за кого меня принимаете ?

Это просто ответ был на ваше "Ident задает смещение, что значит причем ?"

Ссылка на комментарий

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

Ссылка на комментарий

Ну так сместите прямо к границе и не будет проблемы с отображением.

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

Ссылка на комментарий

Пока в FM нет возможности "из коробки" вытащить Handle Application наружу - это не возможно. Можно модифицировать самому исходник среды FM, и я могу вписать функцию в исходник компонента, но тогда он будет работать только у тех, у кого модифицирован исходник среды FM. Это не есть хорошо. Ярослав говорил, что якобы в след. версии студии реализуют такую возможность - тогда компонент можно модифицировать и развивать. Пока не вижу смысла.

Ссылка на комментарий

Пока в FM нет возможности "из коробки" вытащить Handle Application наружу - это не возможно. Можно модифицировать самому исходник, и я могу вписать функцию в исходник компонента, но тогда он будет работать только у тех, у кого модифицирован исходник FM юнита. Это не есть хорошо.

Нет проблем, модифицируйте исходник, скомпилируйте его (в release [x32, x64], debug [x32, x64]), и выложите сюда dcu файлы.

Пользователю всего лишь останется их закинуть в C:\Program Files (x86)\Embarcadero\Studio\14.0\lib и там в соответствующие папки (предварительно сделав бэкпак оригинальных), для временного решения в самый раз.

Ссылка на комментарий

В самый раз для тех, у кого версия среды совпадает с моей... Этот способ не пройдет. Сделайте это сами, вот ссылка на решение.

А что с кодом компонента? нечего править не нужно?
Ссылка на комментарий

Нужно:

procedure TnTrayIcon.Show;
begin
  mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); <<< ---------- ApplicationHWND;
  mPopUpMenu := nTrayMenu;
  mIndent := nIndent;
.....................

Вот это:

mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle);

Изменить на это:

mHWND := ApplicationHWND;
Ссылка на комментарий

Нужно:

procedure TnTrayIcon.Show;
begin
  mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); <<< ---------- ApplicationHWND;
  mPopUpMenu := nTrayMenu;
  mIndent := nIndent;
.....................

Вот это:

mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle);
Изменить на это:

mHWND := ApplicationHWND;

И что это дает?

upd

Пардон туплю, иконка в трее работать теперь стала (с прозрачной формой).

Ссылка на комментарий

Мне долго объяснять что это даст, если Вы не понимаете как ведет себя среда FM. Я лучше подскажу как решить проблему иначе, не изменяя исходников вообще:

 

1. Убрать при создании формы операцию nTrayIcon1.Show;

2. Добавить таймер с интервалом минимум 10 мс

3. В событии тамера: nTrayIcon1.Show -> Отключаем таймер.

 

Всё. Проверил - работает.

Ссылка на комментарий

Рад что Вы разобрались =)

 

P.S. если Вы модифицировали исходник, то можете добавить процедуры для Show и Hide:

ShowWindow(ApplicationHWND, SW_HIDE); // cкрыть из таскбар 
ShowWindow(ApplicationHWND, SW_SHOW); // показать в таскбар
Ссылка на комментарий

Мне долго объяснять что это даст, если Вы не понимаете как ведет себя среда FM. Я лучше подскажу как решить проблему иначе, не изменяя исходников вообще:

 

1. Убрать при создании формы операцию nTrayIcon1.Show;

2. Добавить таймер с интервалом минимум 10 мс

3. В событии тамера: nTrayIcon1.Show -> Отключаем таймер.

 

Всё. Проверил - работает.

Блииин, как же я сразу об этом не подумал... кстати таймер не обязателен, главное этот код не в OnCreate а в OnShow выполнять и все.

А вот на этом огромное спасибо, главную проблему решили таким простым способом =)

Ссылка на комментарий

Можно и так, в компоненте не дублируется создание второй иконки. Но не желательно - лишняя нагрузка. Мы же любим оптимизированный софт =)

 

P.S. если Вы правили исходник среды FM, то проблема с "расположением позади taskbar" так же должна исчезнуть. Проверьте.

Ссылка на комментарий

P.S. если Вы правили исходник среды FM, то проблема с "расположением позади taskbar" так же должна исчезнуть. Проверьте.

Неа, потому я тогда разницы и не увидел.
Ссылка на комментарий
  • 3 месяца спустя...

Доброе время суток!

 

XE6, Win7

 

Подскажите пожалуйста, выполнил все рекомендации, а именно:

  • Добавил в FMX.Platform.Win функцию ApplicationHWND, теперь данный код работает: ShowWindow(ApplicationHWND, SW_HIDE);
  • В компоненте TnTrayIcon заменил FmxHandleToHWND((Self.Owner as TForm).Handle) на ApplicationHWND

Но проблема стала другой, исконка исчезла, хотя место под неё выделилось, но при наведении мыши, выделенное место пропадает:

 

Прикрепить картинку не смог, по этому ссылка на ЯД

 

Перечитал несколько раз все советы, похоже что такая проблема только у меня, с чем это может быть связано?

Ссылка на комментарий
  • 5 месяцев спустя...

Доброе время суток!

 

XE6, Win7

 

Подскажите пожалуйста, выполнил все рекомендации, а именно:

  • Добавил в FMX.Platform.Win функцию ApplicationHWND, теперь данный код работает: ShowWindow(ApplicationHWND, SW_HIDE);
  • В компоненте TnTrayIcon заменил FmxHandleToHWND((Self.Owner as TForm).Handle) на ApplicationHWND

Но проблема стала другой, исконка исчезла, хотя место под неё выделилось, но при наведении мыши, выделенное место пропадает:

 

Прикрепить картинку не смог, по этому ссылка на ЯД

 

Перечитал несколько раз все советы, похоже что такая проблема только у меня, с чем это может быть связано?

 

Извините, я забросил... Перебежал на QT...

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...