![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Захотелось мне сделать что-то типа как в 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)
| ||