Ich denke das Problem das du hast ist, dass du wohl ShowDialog() zum anzeigen der Form nutzt.
(ist auch dämlich dass ich das in meinem Beispiel so gemacht habe, aber ich war mir nicht sicher auf was du hinaus willst, also hab ich der Einfachheit halber ShowDialgog() genutzt)
ShowDialog() blockiert dein Skript so lange, bis das Fenster geschlossen wird. Ein (modaler) Dialog wird auch geschlossen, wenn er nur (z.B. per Hide()) versteckt wird.
Sobald also der Dialog geschlossen/versteckt wird läuft dein Skript weiter und wenn ShowDialog() die letzte Anweisung im Skript ist, dann endet es.
Soweit so gut.
Nur wie lässt sich das beheben?
Ganz einfach: Man sollte das Fenster nicht als Dialog, sondern als non-modales Fenster anzeigen.
Das Problem ist, dass man nicht einfach Show() aufrufen kann, da Powershell keine message pump/loop erzeugt und das Fenster dadurch nutzlos ist, da es keine Anweisungen verarbeiten kann.
(ShowDialog() hingegen erzeugt eine eigene message loop für den Dialog)
Die Lösung:
Die Application.Run Methode, der man ein Form Objekt übergeben kann.
Die Methode erzeugt eine message loop, assoziiert sie mit der Form und zeigt die Form letztendlich an.
Ich hab das obige Beispiel mal etwas umgebaut und entscheidende Stellen im Code kommentiert:
(kannst du in dieser Form auch als Basis für deine Anwendung mit NotifyIcon nutzen)
Code:
[Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms")
function form_SizeChanged
{
if($form.WindowState -eq [Windows.Forms.FormWindowState]"Minimized")
{
$form.Hide()
}
}
function notifyIcon_Click
{
if($form.Visible)
{
$form.Hide()
}
else
{
$form.Show()
$form.WindowState = [Windows.Forms.FormWindowState]"Normal"
}
}
$form = New-Object Windows.Forms.Form
$form.add_SizeChanged({form_SizeChanged})
$notifyIcon = New-Object Windows.Forms.NotifyIcon
$notifyIcon.Icon = New-Object System.Drawing.Icon("C:\IrgendeinPfad\IrgendeinIcon.ico")
$notifyIcon.Visible = $True
$notifyIcon.add_Click({notifyIcon_Click})
# Dieser Aufruf blockt solange bis das Fenster geschlossen wird.
# Außerdem wird ein message pump/loop für das Fenster gestartet.
[System.Windows.Forms.Application]::Run($form)
# wichtig, sonst bleibt das Icon nach dem Beenden im Tray
# und wirft Exceptions beim draufklicken.
$notifyIcon.Dispose()