Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.01.2022, 11:40
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию свой NotifycationCenter для своих программ...

Захотелось мне сделать что-то типа как в win10 NotifycationCenter..
У меня Win7, тут нет никакого NotifycationCenter...
Хочу что бы программа висела в трее, и имела возможность принимать integer, string, и иконку передаваемой программы..

К примеру написал я программу для скачивания файла, после скачивания программа посылает сообщение в центр уведомлений, а уже центр уведомлений показывает оповещение..

Что посоветуете использовать? Как правильно подойти к этому?
Ответить с цитированием
  #2  
Старый 24.01.2022, 22:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если надо сохранять сообщения, то придется писать свой центр сообщений.
А если просто показать, то пользоваться функцией ShowBalloonHint компонента TTrayIcon. Если у тебя нет этого компонента (например, в Delphi 7), то ищи компонент TCoolTrayIcon (именно на основе этого компонента в последних версиях Delphi сделан встроенный TTrayIcon). Кстати, этот хинт в Windows 10 появится в Notification Center.
Ну а если хочется полного управления, то придется писать что-то полностью свое. Перекрывать отрисовку окна, в том числе появление, исчезновение и весь функционал, который тебе нужен.
Ответить с цитированием
  #3  
Старый 25.01.2022, 00:12
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Если надо сохранять сообщения, то придется писать свой центр сообщений.
А если просто показать, то пользоваться функцией ShowBalloonHint компонента TTrayIcon. Если у тебя нет этого компонента (например, в Delphi 7), то ищи компонент TCoolTrayIcon (именно на основе этого компонента в последних версиях Delphi сделан встроенный TTrayIcon). Кстати, этот хинт в Windows 10 появится в Notification Center.
Ну а если хочется полного управления, то придется писать что-то полностью свое. Перекрывать отрисовку окна, в том числе появление, исчезновение и весь функционал, который тебе нужен.
Возможно я запутано объяснил)
Мне не нужно взаимодействие с системой и системными событиями...
Нужна связь между программами(моими проектами) с основной программой, которая будет принимать от них некие сообщения, уведомления...
К примеру вместо showmessage(); посылать сообщения основной программе, что бы она вывела его. Как она будет выводить его - дело 10-е ))
У меня проблема с связью этих программ с основной.

Я понимаю что надо как-то взаимодействовать, но как - не знаю.
Вот и прошу совета) какой инструмент для этого использовать?
Но при этом нужно что бы главная форма могла получить иконку программы которая посылает ей сообщение.

Последний раз редактировалось Gareth, 25.01.2022 в 00:15.
Ответить с цитированием
  #4  
Старый 25.01.2022, 01:47
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Пока сделал такой вариант:

программа посылающее сообщение [центру уведомлений]
Код:
const
  CMD_SETLABELTEXT = 1; // Задаем ID команды 
....
.....

function Notify_Send(EXE_PATH, aMESSAGE: string): Boolean;
var
  CDS: TCopyDataStruct;
  SUPER_MESSAGE: string;
begin
  SUPER_MESSAGE := '[' + EXE_PATH + '] ' + '[' + aMESSAGE + ']'; // склеиваем информацию в одну строку
  { ---------------------------------------------------- }
  CDS.dwData := CMD_SETLABELTEXT; // Устанавливаем тип команды
  CDS.cbData := Length(SUPER_MESSAGE) + 1; // Устанавливаем длину передаваемых данных
  GetMem(CDS.lpData, CDS.cbData); // Выделяем память буфера для передачи данных
  try
    StrPCopy(CDS.lpData, AnsiString(SUPER_MESSAGE)); // Копируем данные в буфер
    // Отсылаем сообщение в окно с заголовком MyNotifyCentr_BKF
    SendMessage(FindWindow(nil, 'MyNotifyCentr_BKF'), WM_COPYDATA, Form1.Handle, Integer(@CDS));
  finally
    FreeMem(CDS.lpData, CDS.cbData); // Высвобождаем буфер
  end;
end;


Программа центр уведомлений, которая принимает сообщения
Код:
  
private
  // Обработчик сообщения WM_COPYDATA
    procedure WMCopyData(var MessageData: TWMCopyData); message WM_COPYDATA;

.......
......
const
  CMD_SETLABELTEXT = 1;

.......
......
procedure TForm1.WMCopyData(var MessageData: TWMCopyData);
begin
  // Устанавливаем свойства метки, если заданная команда совпадает
  if MessageData.CopyDataStruct.dwData = CMD_SETLABELTEXT then
  begin
    // Устанавливаем текст из полученных данных
    sLabel1.Caption := PAnsiChar((MessageData.CopyDataStruct.lpData));
    MessageData.Result := 1;
  end
  else
    MessageData.Result := 0;
end;

посылать в окно сообщение, в котором путь к exeшнику который посылает сообщение, и само сообщение..
В программе которая принимает сообщения, я беру путь к exeшнику и получаю его иконку с помощью ExtractAssociatedIcon.
Есть ли еще какие-либо способы?

Последний раз редактировалось Gareth, 25.01.2022 в 01:53.
Ответить с цитированием
  #5  
Старый 25.01.2022, 08:21
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Тему можно закрывать, за ночь сделал всё что хотел.
Метод описанный выше устраивает)

Ответить с цитированием
  #6  
Старый 25.01.2022, 17:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну извини, не понял вопрос.
В прнципе, да, WM_COPYDATA именно для подобного и предназначено.
Еще можно регистрировать свое сообщение и потом рассылать его всем:
Код:
WndMessage := RegisterWindowMessage(PChar(GetMessageName));
...
PostMessage(HWND_BROADCAST,WndMessage,0,0);
Да, почему используется PostMessage, а не SendMesage. SendMessage "ожилает" ответа, т.е. обработки сообщения, а вот PostMessage просто отправляет сообщение и "забывает" об этом. Т.е. в своем случае, если главной программы нет (не запущена), то у тебя будет либо вообще эксепшн, либо программа подвиснет. В случае моего примера просто ничего не произойдет и программа продолжит работу.

ЗЫ.
GetMessageName - это моя функция, которая генерирует некоторое "уникальное" имя сообщения (униальное для сессии пользователя). Для понимания, если 2 программы вызовут RegisterWindowMessage с одинаковым именем, то они получат один и тот же идентификатор для зарегистрированного сообщения.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Gareth (26.01.2022)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter