xlucipher
Goto Top

Powershell BalloonTip - Name anpassen

Mahlzeit die Damen und Herren,

ich wünsche zunächst einen guten Morgen, Mittag oder Abend.

Ich setze mich gerne mit PowerShell auseinander, gerade was so kleinere Skripte angeht.
Nun habe ich mir ein Skript geschrieben, welches einen BalloonTip erzeugt und das funktioniert absolut reibungslos.
Mein Problem ist nur, oben im BalloonTip steht ein mich störender Name. Ich frage mich jetzt, wie kann ich den anpassen?
Google hat mir da nicht so wirklich weiter geholfen, könnte aber auch sein, dass meine Frage evtl. nicht richtig dafür formuliert war.

Anbei ein Screenshot, damit ihr wisst, was ich meine.
Vielleicht ist das ja sogar nur ein Einzeiler, den ich einfach übersehen habe.
Ich danke für eure Hilfe!
passwdrequest_1

Content-Key: 1739206501

Url: https://administrator.de/contentid/1739206501

Printed on: April 26, 2024 at 08:04 o'clock

Member: TK1987
TK1987 Jan 19, 2022 at 10:34:24 (UTC)
Goto Top
Moin,

das geht über die BalloonTipTitle-Eigenschaft.

Gruß Thomas
Member: xLucipher
xLucipher Jan 19, 2022 at 14:27:26 (UTC)
Goto Top
Hallo TK1987,

danke für deine schnelle Antwort.
Deine Lösung ist leider nicht korrekt oder zumindest jetzt nicht mehr zutreffend.
Ich habe dir im angehangenen Screenshot markiert, welche Bereiche durch was gesteuert werden.
Die Variablen habe ich dafür bereits gesetzt.
passwdrequest_2
		$balloon.BalloonTipText = "$Nachricht"  
		$balloon.BalloonTipTitle = "Achtung! $userinfo"  
		$balloon.Visible = $true
		$balloon.ShowBalloonTip(3000)
		$balloon.Dispose()
Member: TK1987
TK1987 Jan 19, 2022 updated at 15:54:52 (UTC)
Goto Top
Ok stimmt, habs gerade mal getestet.

Der Titel den du ändern willst ist wohl der Titel des Porgramms, dass den Balloontip erzeugt (in meinem Fall daher immer "Windows PowerShell".

Die einzige Möglichkeit, wie ich es auf die schnelle hinbekommen habe, diesen Titel zu beeinflussen war das Skript mit PS2EXE zu konvertieren - hierbei kann dann ein Titel festgelegt werden.

back-to-topZuerst muss dafür einmalig das PS2EXE-Modul in Powershell installiert werden:
# Entweder für alle Benutzer (benötigt Adminrechte)
Install-Module -Name ps2exe -Force

# Alternativ: Nur für den angemeldeten Benutzer (geht ohne Adminrechte)
Install-Module -Scope CurrentUser -Name ps2exe -Force

back-to-topSkripte in EXE konvertieren geht damit so:
ps2exe -InputFile "C:\Pfad\zum\Skript.ps1" -OutputFile "C:\Pfad\zum\Programm.exe" -Title "Hier dann dein Titel" -NoConsole -NoOutput  

Das Skript könnte in etwa so aussehen:
[CmdletBinding()]
Param(
  [int]$Timeout,
  [String]$Text,
  [String]$Title,
  [ValidateSet('None','Info','Warning','Error')]$Icon  
)

Add-Type -A System.Windows.Forms

$Balloon = New-Object System.Windows.Forms.NotifyIcon -p @{
  Icon            = [System.Drawing.Icon]::New( [IO.MemoryStream](iwr -useb 'Administrator.de/favicon.ico').Content )  
  Visible         = $true
}

$Balloon.ShowBalloonTip($Timeout, $Title, $Text, $Icon)

Damit könntest du dann wie folgt Nachrichten kreieren:
C:\Pfad\zu\deinem\Programm.exe -Timeout 1000 -Text "Hallo Leute" -Title "Nachricht" -Icon Info  

# Oder natürlich auch in kurz durch Parameterauslassung:
C:\Pfad\zu\deinem\Programm.exe 1000 "Hallo Leute" "Nachricht" "Info"  

falls du dies jedoch auch auf anderen Computern nutzen willst, solltest du die EXE mit einem Codesigning-Zetifikat signieren, da das Programm sonst u.U. als nicht vertrauenswürdig eingestuft wird.

Gruß Thomas
Member: colinardo
Solution colinardo Jan 19, 2022 updated at 17:46:15 (UTC)
Goto Top
Servus @xLucipher,
BallonTips sind eigentlich eine Technik von Gestern und werden aus Kompatibilitätsgründen von den aktuellen Windows-Versionen in die neue Technik für solche Benachrichtigungen umgewandelt, namentlich sind das Toast-Messages (Da hat der MS Entwickler wohl gerade gefrühstückt face-smile). Per Default nutzt Windows dazu die AppUserModelID die es aus der aufrufenden App extrahiert.

Toast-Messages lassen sich auch nativ mit der Powershell erzeugen und dabei lässt sich auch der App-Title für den Toast beliebig anpassen. In den Toasts lassen sich auch benutzerdefinierte Grafiken oder Buttons einblenden wenn man möchte, damit hat man viel mehr Gestaltungsmöglichkeiten ...
function Show-ToastNotification {
    param(
        [parameter(mandatory=$false)][ValidateSet('Title+Text','Image+Text')][string]$type = 'Title+Text',  
        [parameter(mandatory=$false)][string]$apptitle = "Powershell",  
        [parameter(mandatory=$false)][string]$message,
        [parameter(mandatory=$false)][System.DateTimeOffset]$expiration = [DateTimeOffset]::Now.AddMinutes(60),
        [parameter(mandatory=$false)][switch]$expiresOnReboot,
        [parameter(mandatory=$false)][Windows.UI.Notifications.ToastNotificationPriority]$priority = 'Default',  
        [parameter(mandatory=$false)][switch]$suppressPopup,
        [parameter(mandatory=$false)][switch]$includeCloseButton,
        [parameter(mandatory=$false)][switch]$includeDismissButton
    )
    DynamicParam {
        $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
        $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
        $attr = new-object System.Management.Automation.ParameterAttribute
        switch($type){
            'Title+Text'{  
                $attr.ParameterSetName = "A"  
                $attr.Mandatory = $false
                $attrCollection.Add($attr)
                $paramDic.Add("title", (new-object System.Management.Automation.RuntimeDefinedParameter("title", [String], $attrCollection)))  
            }
            'Image+Text'{  
                $attr.ParameterSetName = "B"  
                $attr.Mandatory = $false
                $attrCollection.Add($attr)
                $paramDic.Add("image", (new-object System.Management.Automation.RuntimeDefinedParameter("image", [String], $attrCollection)))  
            }
        }
        return $paramDic
    }
    begin{}
    process{}
    end{
        [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | out-null
        [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | out-null
        $xml = $null
        switch($type){
            'Title+Text' {  
                $xml = [xml]([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)).GetXML()
                # set toast content
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=1]').InnerText = $PSBoundParameters.title  
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=2]').InnerText = $message  
             }
             'Image+Text' {  
                $xml = [xml]([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastImageAndText01)).GetXML()
                # set toast content
                $xml.SelectSingleNode('/toast/visual/binding/text[@id=1]').InnerText = $message  
                $xml.SelectSingleNode('/toast/visual/binding/image[@id=1]').src = $PSBoundParameters.image  
             }
        }

        # add command buttons
        if($includeCloseButton.IsPresent -or $includeDismissButton.IsPresent){
            $commands = $xml.CreateElement('commands')  
            if ($includeCloseButton.IsPresent){
                $command = $xml.CreateElement('command')  
                $command.SetAttribute('id','dismiss') >$null  
                $commands.AppendChild($command) >$null
            }
            if($includeDismissButton.IsPresent){
                $command = $xml.CreateElement('command')  
                $command.SetAttribute('id','snooze') >$null  
                $commands.AppendChild($command) >$null
            }
            $xml.DocumentElement.AppendChild($commands) >$null
        }
        # convert xml object to DOM XML
        $dom = New-Object Windows.Data.Xml.Dom.XmlDocument
        $dom.LoadXml($xml.OuterXml)
        # create toast
        $toast = New-Object Windows.UI.Notifications.ToastNotification $dom -Property @{
            Tag = [System.Web.Security.Membership]::GeneratePassword(15,0)
            Group = "PowerShell"  
            ExpirationTime = $expiration
            ExpiresOnReboot = $expiresOnReboot.IsPresent
            Priority = $priority
            SuppressPopup = $suppressPopup.IsPresent
        }
        # create notifier and show toast
        [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($apptitle).Show($toast)
    }
}

back-to-topAnwendungsbeispiele für die Funktion


back-to-topTitel + Text

Show-ToastNotification `
        -type Title+Text `
        -Title "Das ist meine Überschrift" `  
        -apptitle "Das ist meine App" `          
        -message "Hallo das ist ein Test, oder was auch immer." `  
        -includeCloseButton `
        -expiresOnReboot

screenshot

back-to-topImage + Text

Show-ToastNotification `
        -type Image+Text `        
        -image 'C:\Windows\WinSxS\amd64_microsoft-windows-mediaplayer-core_31bf3856ad364e35_10.0.22000.282_none_069016efd47610d8\DMR_120.jpg' `  
        -apptitle "Das ist meine App" `          
        -message "Hallo das ist ein Test, oder was auch immer." `  
        -includeCloseButton `
        -expiration ([DatetimeOffset]::Now.AddMinutes(1))

screenshot

Grüße Uwe
Member: xLucipher
xLucipher Jan 20, 2022 at 10:41:37 (UTC)
Goto Top
Vielen Dank für eure Antworten. Beide sehr hilfreich und ausführlich beschrieben.
@TK1987 leider ist das konvertieren für mich keine Option.
@colinardo sehr interessant! Da ist mir wohl etwas entfallen. Ich habe diese Option leider gar nicht beachtet und werde mein Skript dann wohl mal überarbeiten. Ich danke euch sehr und werde das Thema hier vorerst als "beantwortet" markieren, oder wie man das hier nennt.

Sollten weitere Fragen auftauchen hört, sieht man sich bestimmt erneut. face-smile

Gruß Dominic