Einzelnen Beitrag anzeigen

Yersinian

Registriert seit: 16. Okt 2023
8 Beiträge
 
#1

Toast Notification in Windows 10/11 mit Eventhandler

  Alt 16. Okt 2023, 11:06
Hi!

Ich nutze Delphi 10.2 und erarbeite gerade für eine recht komplexe Software in unserem Betrieb die Möglichkeit Notifications auszuschmeißen,
wenn neue Nachrichten im integrierten Chat vorhanden sind.

Bisher nutzte ich dafür folgendes:

Code:
procedure TWindowsBenachrichtigung.DoReceiveLocalNotification(Sender: TObject;
  ANotification: TNotification);
begin
    //Öffnet die Chatübersicht des Benutzers, der gerade angemeldet ist.
end;

constructor TWindowsBenachrichtigung.Create;
begin
     inherited;
     FNachricht := TNotification.Create;
     FNachrichtCenter := TNotificationCenter.Create(nil);
end;

procedure TWindowsBenachrichtigung.SendeBenachrichtigung(ASender: TObject; ABenachrichtigungstitel, AVorschauText: String);
begin
     try
        FNachricht.EnableSound := True;
        FNachricht.AlertBody := AVorschautext;
        FNachricht.Title := ABenachrichtigungstitel;
        FNachrichtCenter.OnReceiveLocalNotification := DoReceiveLocalNotification;
        FNachrichtCenter.PresentNotification(FNachricht);
     finally
     end;
end;
Dies hat aber ein großes Problem. Die erste Notification des Tages hat einen cryptischen Titel wie Embarcadero.Toasts.######### (siehe First Note.png)
und alle danach folgenden immer nur den Exe-Namen (Next Notes.png).

Sie soll aber gezielte Bezeichnungen enthalten. Das ist über XML machbar (Ziel.png). Das verstehe ich soweit. Ich habe auch da ein Projekt erstellt, das das ganze macht.
Ich habe ein Reg-Key erstellt und habe eine ErstelleToast-Methode.

Auf Click führt er dann über die Exe etwas aus.

Das Problem ist daran, dass er halt ne neue Exe öffnen will etc. über Reg-key-shell-open-command

Ich möchte aber gern ein simples Notify-Event haben wie bei der ursprünglichen Version.

Es soll so sein, dass ein Nutzer Mitteilungen erhält, solang er im Programm ist.
Sobald das Programm geschlossen wird wird das Action-Center von Windows eh leergeräumt.

Der Klick auf die Notification soll dann die Chatübersicht des Benutzers öffnen.


Mein Methode zum Erstellen sieht so aus
Code:
procedure ErstelleToast;
var
     ToastNotificationManagerStatics : IToastNotificationManagerStatics;
     ToastTemplate : Xml_Dom_IXmlDocument;
     LToastNotification : IToastNotification;
     ToastNotificationManagerFactory : IInspectable;
     ToastNotificationFactory : IInspectable;
     hAppID : HString;
begin
     InitialisiereWindowsRunTime;
     ToastNotificationManagerFactory := GetFactory(sToastNotificationManager, '{50AC103F-D235-4598-BBEF-98FE4D1A3AD4}');
     ToastNotificationManagerStatics := IToastNotificationManagerStatics(ToastNotificationManagerFactory);
     ToastTemplate := ToastNotificationManagerStatics.GetTemplateContent(ToastTemplateType.ToastText01);
     UeberschreibeToastTemplateXML(ToastTemplate, cNotificationXML);
     ToastNotificationFactory := GetFactory(SToastNotification, '{04124B20-82C6-4229-B109-FD9ED4662B53}');
     LToastNotification := IToastNotificationFactory(ToastNotificationFactory).CreateToastNotification(ToastTemplate);
     hAppID := StringToHString(cNotificationAppID);
     try
          ToastNotificationManagerStatics.CreateToastNotifier(hAppID).Show(LToastNotification);
     finally
          WindowsDeleteString(hAppID);
     end;
end;
Der XML-PArt sieht so aus
Code:
     cNotificationXML = '<toast activationType="protocol" launch="WinRTToast://NotificationClick?param1=value1">' +
                        ' <visual>' +
                        '   <binding template="ToastGeneric">' +
                        '     <text>Nachrichten</text>' +
                        '     <text>Neue Nachricht</text>' +
                        '     <image placement="appLogoOverride" src="file:\\\C:\Ordner\Unterordner\programm.ico" />' +
                        '   </binding>' +
                        ' </visual>' +
                        ' <actions>' +
                        ' <action content="Öffne Nachricht" activationType="protocol" arguments="WinRTToast://NotificationClick?param1=value1" />' +
                        ' </actions>' +
                        '</toast>';
Ich habe das Internet durchforstet, aber nichts gefunden, was mich so richtig auf den Weg geführt hat, den ich benötige.

Könnt ihr mir eine Anleitung/Tipps und Tricks mitgeben, wie ich mein Vorhaben verwirklichen kann?

Wenn ihr weitere Informationen braucht, dann sagt gern bescheid. Ich freue mich auf eure Rückmeldungen.

Danke!
Miniaturansicht angehängter Grafiken
first-note.png   next-notes.png   ziel.png  

Geändert von Yersinian (16. Okt 2023 um 11:18 Uhr)
  Mit Zitat antworten Zitat