Notifications UDF - Desktop Benachrichtigungen 1.2 (Update 1. Mai)

  • Tach,

    ich habe im Rahmen eines anderen Programmes Desktopbenachrichtigungen benötigt. Mit der Zeit wuchs der Code immer weiter an und letztendlich dachte ich, dass das eine schöne Sache ist und ich das ja mit der Welt teilen kann. Ich weiß, dass es bereits eine ähnliche UDF gibt, aber ich wollte für mein Programm eine eigene Lösung erarbeiten, und als das Projekt mit der Zeit wuchs, habe ich eine eigene UDF erstellt.


    Also, was haben wir hier?
    Die UDF stellt auf sehr einfache Art und Weise Desktopbenachrichtigungen bereit. Die Anordnung erfolgt auf dem Hauptbildschirm unten rechts, Benachrichtigungen werden gestapelt, solange Platz verfügbar ist, weitere werden erstmal versteckt. Beim Schließen von Benachrichtigungen rücken die anderen auf. Die Benachrichtigungen haben ein hübsches, minimalistisches Design in zwei Farben (Hintergrund- und Textfarbe). Standardmäßig sehen sie aus wie die dunkle Taskleiste in Windows 10 (inklusive der Transparenz), die Farben und weitere Parameter lassen sich aber einstellen um auch an andere Umgebungen angepasst werden zu können (s. Beispielskripte). Die UDF funktioniert sowohl wenn GUIOnEventMode benutzt oder nicht benutzt wird und erkennt dies automatisch.


    Zeig her
    Die Benachrichtigung besteht aus der GUI, dem Titel, der Nachricht, einer Trennlinie, der Datumsanzeige, der Uhrzeitanzeige, und dem Schließen-Button (außerdem einem Rahmen (Border) der Benachrichtigung, wenn aktiviert). Die Farbe von Titel, Nachricht, Trennlinie, Datum, Uhrzeit und Schließen-Button (und Border) wird durch die Textfarbe bestimmt, der Hintergrund für die Benachrichtigung durch die Hintergrundfarbe.


    Aktuell haben die Benachrichtigungen eine feste Größe. Über variable Größen habe ich nachgedacht, aber bisher nicht eingebaut, da ich es nicht benötige.
    Interessiert oder Begeisterte werden vielleicht feststellen, dass die Trennlinie bei den Benachrichtigungen nicht durchgehend ist. Das liegt einfach daran, dass es besser aussieht ;)

    Ansonsten haben Benachrichtigungen folgendes Design:

    • Windows 10: Gleiches Design wie die Taskleiste
    • Windows 8/8.1: Bei bestimmten Designs haben sie die Farbe wie der Rahmen des aktiven Fensters, sonst sind sie schwarz mit Transparenz (s. Screenshot)
    • Windows 7 und eher: schwarz mit Transparenz


    Wie binde ich die Benachrichtigungen in mein Script ein?

    • UDF includen
    • _Notifications_Startup() aufrufen (nachdem festgelegt wurde ob GUIOnEventMode benutzt werden soll oder nicht!)

      • sofern GUIOnEventMode nicht benutzt wird: Rufe in deiner Hauptschleife die Funktion _Notifications_CheckGUIMsg($__GUIMsg) auf und übergib ihr den Rückgabewert von GUIGetMsg
    • Erstelle eine Benachrichtigung mit _Notifications_Create($__title, $__message)


    Vor dem dritten Schritt kann das Aussehen und Anderes mit den Set-Funktionen verändert werden (s. Beispielskripte):

    Code
    _Notifications_SetAnimationTime
    _Notifications_SetBorder
    _Notifications_SetButtonText
    _Notifications_SetBkColor
    _Notifications_SetColor
    _Notifications_SetDateFormat
    _Notifications_SetSound
    _Notifications_SetTextAlign
    _Notifications_SetTimeFormat
    _Notifications_SetTransparency

    Außerdem können eigene Funktionen festgelegt werden, die aufgerufen werden, wenn eine Benachrichtigung geklickt wurde (s. Advanced Example)


    Und nu?
    Weitere Infos finden sich in der umfänglich dokumentierten UDF-Datei.
    Zwei Beispielskripte zeigen außerdem, wie die Anwendung aussehen kann, einmal für GUIOnEventMode aktiviert, einmal deaktiviert. Ein weiteres Beispiel demonstriert das Verändern der Benachrichtigungen mit den Set-Funcktionen.


    Wars das?
    Jup, viel Spaß


    Changelog

    Spoiler anzeigen


    Notifications.au3 (v1.2)
    Notifications GUIMsg Example.au3
    Notifications OnEvent Example.au3
    Notifications Advanced Example.au3

  • Top UDF! Wird gleich in meine UDF-Sammlung aufgenommen.

    Edit: Kleinen Schönheitsfehler habe ich aber gefunden in deinem GUIOnEventMode-Beispiel. Die Boxen rutschen unterschiedlich schnell nach. Manchmal direkt und schön flüssig, manchmal langsam und stockend.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke fürs Feedback.

    @chip Was hast du für eine CPU? Ich konnte das jetzt nicht auf schwächeren CPUs testen, auf meinem i5 @4GHz läufts aber immer flüssig. Aktuell werden alle Benachrichtigungen, die bewegt werden müssen, jeweils um einen Pixel nach unten geschoben, dann von vorne, bis Ziel erreicht ist. Wenn jemand einen Weg kennt um alle Benachrichtigungen mit weniger Last zu bewegen (gleichzeitig), nur her damit :D

  • @S3cret i7 @ 3,4 GHz. Ist auch etwas seltsam. Die letzte Nachricht ganz unten bestätige dann rutscht alles komplett flüssig nach unten. Lösche ich dazwischen eine raus dann ist es Zufall ob es flüssig ist oder nicht.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Nach meiner letzten Nachricht habe ich selber nochmal getestet, und bei mir hat es auch auf einmal gestottert und je mehr Benachrichtigungen ich geschlossen habe, desto langsamer wurde das Verschieben auch... Das ist heute das erst mal, dass der Fehler auftritt und ich hab seit Tagen nichts an der Move-Funktion geändert.

    Jetzt allerdings (1h später) ist das Problem wieder wie von selbst verschwunden.

    Kannst du mal testen ob eine höhere CPU Priorität das Problem für dich löst?
    ProcessSetPriority(@AutoItPID, 4)

    Habs jetzt mal auf meinem Notebook mit einem i5 6200U probiert. Läuft absolut flüssig. Scheint dann ja so, als bekäme der AutoIt Prozess manchmal aus irgendeinem Grund zu wenig CPU Zeit. Hoffe das mit der Priorität behebt das. Die Priorität für die Animationsdauer zu ändern schadet ja nicht.

  • Kann ich erst morgen machen, aber hier mal ein Ansatz den ich noch gefunden hatte, welcher eigentlich die Forschleife mit dem Pixelweisen verschieben von jedem einzelnen Fenster überflüssig machen sollte:

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • @S3cret also CPU Priorität erhöhen hat nichts gebracht. Habe jetzt aber mal _Notifications_SetAnimationTime(1) gemacht. Gefühlt wird das verschieben nun nicht langsamer, was wohl direkt schon an der Startgeschwindigkeit liegt. Reicht mir aber.

    Dabei ist mir noch kleiner Bug aufgefallen. Wenn man _Notifications_SetAnimationTime(0) setzt werden die GUI unten aus dem Desktop raus geschoben, wenn man ein beliebiges Fenster (nicht das letzte ganz unten) schließt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ahh ein Bug!!

    Soo, hab mal ein paar Anpassungen gemacht und eine neue Version hochgeladen. Danke für die Meldung des Fehler s bei AnimationTime = 0 =)
    Hab noch ein paar andere Änderungen in der Move-Funktion gemacht, einfach mal probieren. Ansonsten habe ich grad keine Idee warum das stottert...

    Code
    v1.1 	Improvement	Gives the process a higher priority while windows are moved for hopefully smoother window movement
    	Improvement	Restructured window movement code for faster execution (therefore removed _Notifications_Sleep)
    	Bugfix		Notifications were all moved and could disappear when one was closed in case AnimationTime was set to 0
  • Hallo Freunde von schönen Benachrichtigungen. Hab mal wieder ein Update für Interessierte.

    Design:

    • Windows 10: Benachrichtigungen sehen so aus wie die Taskleiste.
    • Windows 8/8.1: Bei bestimmten Designs sieht die Benachrichtigung aus wie der Rahmen des aktiven Fensters, ansonsten ist sie schwarz mit Transparenz
    • Windows 7 und eher: Schwarz mit Transparenz

    Vielen Dank an nend aus dem englischen AutoIt Forum.

    Außerdem:

    • Benachrichtigungen verschwinden langsam wenn sie geschlossen werden (wenn animationTime > 0)
    • eigene Funktionen können aufgerufen werden wenn eine Benachrichtigung geklickt wird (s. Parameter von _Notifications_Create und das Advanced Example)
    • Eigene Benachrichtigungstöne können genutzt werden mit _Notifications_SetSound (mp3 und wav)
    • Schließe alle Benachrichtigungen mit _Notifications_CloseAll

    Und eine Änderung:
    _Notifications_SetTextColor heißt jetzt _Notifications_SetColor, da nicht nur die Textfarbe geändert wird, sondern auf die der Trennlinie oder des Rahmens.

    Zusätzlich habe ich die Beispiele überarbeitet. Das GUIMsg und OnEvent Beispiel sind jetzt auf das wesentliche reduziert, das Advanced Example zeigt das Benutzen der Set-Funktionen.

    Viel Spaß,
    wenn Fehler/Bugs auftreten, bitte melden.