|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
свой NotifycationCenter для своих программ...
Захотелось мне сделать что-то типа как в win10 NotifycationCenter..
У меня Win7, тут нет никакого NotifycationCenter... Хочу что бы программа висела в трее, и имела возможность принимать integer, string, и иконку передаваемой программы.. К примеру написал я программу для скачивания файла, после скачивания программа посылает сообщение в центр уведомлений, а уже центр уведомлений показывает оповещение.. Что посоветуете использовать? Как правильно подойти к этому? |
#2
|
|||
|
|||
Если надо сохранять сообщения, то придется писать свой центр сообщений.
А если просто показать, то пользоваться функцией ShowBalloonHint компонента TTrayIcon. Если у тебя нет этого компонента (например, в Delphi 7), то ищи компонент TCoolTrayIcon (именно на основе этого компонента в последних версиях Delphi сделан встроенный TTrayIcon). Кстати, этот хинт в Windows 10 появится в Notification Center. Ну а если хочется полного управления, то придется писать что-то полностью свое. Перекрывать отрисовку окна, в том числе появление, исчезновение и весь функционал, который тебе нужен. |
#3
|
|||
|
|||
Цитата:
Мне не нужно взаимодействие с системой и системными событиями... Нужна связь между программами(моими проектами) с основной программой, которая будет принимать от них некие сообщения, уведомления... К примеру вместо showmessage(); посылать сообщения основной программе, что бы она вывела его. Как она будет выводить его - дело 10-е )) У меня проблема с связью этих программ с основной. Я понимаю что надо как-то взаимодействовать, но как - не знаю. Вот и прошу совета) какой инструмент для этого использовать? Но при этом нужно что бы главная форма могла получить иконку программы которая посылает ей сообщение. Последний раз редактировалось Gareth, 25.01.2022 в 00:15. |
#4
|
|||
|
|||
Пока сделал такой вариант:
программа посылающее сообщение [центру уведомлений] Код:
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
|
|||
|
|||
Тему можно закрывать, за ночь сделал всё что хотел.
Метод описанный выше устраивает) |
#6
|
|||
|
|||
Ну извини, не понял вопрос.
В прнципе, да, WM_COPYDATA именно для подобного и предназначено. Еще можно регистрировать свое сообщение и потом рассылать его всем: Код:
WndMessage := RegisterWindowMessage(PChar(GetMessageName)); ... PostMessage(HWND_BROADCAST,WndMessage,0,0); ЗЫ. GetMessageName - это моя функция, которая генерирует некоторое "уникальное" имя сообщения (униальное для сессии пользователя). Для понимания, если 2 программы вызовут RegisterWindowMessage с одинаковым именем, то они получат один и тот же идентификатор для зарегистрированного сообщения. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Gareth (26.01.2022)
|