Пока сделал такой вариант:
программа посылающее сообщение [центру уведомлений]
Код:
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.
Есть ли еще какие-либо способы?