none
Programm "ordnungsgemäß" beenden RRS feed

  • Frage

  • Hallo zusammen,

    ich hatte mir ein Powershell Skript erstellt mit dem der VLC Player beendet wird. Soweit hat alles gut funktioniert. Was der Gedanke dahinter war, das sich Windows auch die Position des VLC Players merkt. Doch leider geht das nicht. Denn das Skript ist ein Stop-Process (funktioniert auch nicht mit Get-Process) und dadurch merkt sich Windows wohl nicht die Position eines Programmes (habe es auch mit einem anderen Programm probiert).

    Gibt es ein Befehl das im Prinzip das Fenster normal beendet, als ob ich mit dem Mausezeiger auf schließen klicke?

    Bin gespannt auf eure Antworten. :)


    Freitag, 5. März 2021 08:42

Antworten

  • Sendkeys ist sehr unpräzise. Wenn sich ein anderes Fenster oder Popup dazwischenschiebt, schließt dein Script das.

    Das hier funktioniert auch und ist sicherer:

    Get-Process 'vlc' |   Foreach-Object { $_.CloseMainWindow() }

     

    Grüße, Denniver

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Samstag, 17. April 2021 10:49
    Moderator

Alle Antworten

  • Ja, allerdings nicht so einfach:
    https://stackoverflow.com/questions/16653517/how-best-to-post-wm-quit-to-a-running-process

    Ein Programm wird beendet mit WM_QUIT im Messageloop (ALT+F4).

    Die Alternative ist SendKeys "%F4".
    https://www.jesusninoc.com/11/05/simulate-key-press-by-user-with-sendkeys-and-powershell/

    Freitag, 5. März 2021 09:32
  • Hallo, also ich habe die Möglichkeit mit dem SendKey probiert. Irgendwas mache ich falsch das es nicht funktioniert. Ich habe noch aus einem anderen Forum ein Skript her und habe, in meinem Fall „^p“ = „Strg + p„ eingefügt um VLC zu schließen. Ihr könnt es aus dem Skript entnehmen. Nicht wundern vor dem Satz hab ich noch ein Skript der das Ausführen von dem Prozess um 5 Sekunden verschiebt. $Start = Get-Date $Duration = New-TimeSpan -Seconds 1 $End = $Start + $Duration Do{ Start-Sleep -Seconds 5 $DisplayTime = New-TimeSpan -Start $(Get-Date) -End $End $Time = "{0:D2}:{1:D2}" -f ($DisplayTime.Minutes), ($DisplayTime.Seconds) Write-Progress $Time } While((Get-date) -lt $End) [System.Windows.Forms.SendKeys]::SendWait("{^x}") Danke für eure Hilfe
    • Bearbeitet Engel4 Sonntag, 7. März 2021 11:55
    Sonntag, 7. März 2021 11:51
  • Wenn du schon Code postest, dann nimm auch bitte das Codefenster.

    Als STRG+P ist in der Regel für das Drucken gedacht.
    Aber ALT+F4 wird von Windows bereits in eine Nachricht "WM_QUIT" übersetzt. Der Tastencode kann so vom Programm gar nicht direkt abgefragt werden, sondern nur per KeyboardHook. Letzteres ist aber meist übertrieben.

    Sonntag, 7. März 2021 13:15
  • $Start = Get-Date
    $Duration = New-TimeSpan -Seconds 1
    $End = $Start + $Duration
    Do{
        Start-Sleep -Seconds 5
        $DisplayTime = New-TimeSpan -Start $(Get-Date) -End $End
        $Time = "{0:D2}:{1:D2}" -f ($DisplayTime.Minutes),  ($DisplayTime.Seconds)
        Write-Progress $Time 
    }
    While((Get-date) -lt $End)
    [System.Windows.Forms.SendKeys]::SendWait("{^x}")
    Okay, aber das Alt+F4 habe ich auch probiert und da hat er auch nichts gemacht. 
    Sonntag, 7. März 2021 14:09
  • Nun ja, SendKeys sendet die Tastenfolge an das gerade aktive Fenster im Vordergrund.
    Hast du da gerade den Desktop angezeigt (WIN+D), willst du die Maschine runterfahren.
    Also musst du deinen VLC-Player erst mal in den Vordergrund holen, was bei Minimized z.B. nicht möglich ist.
    Dafür gibts aber keine Tastenfolgen.

    Allerdings hat sich da schon mal jemand Gedanken gemacht:
    https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/bringing-window-in-the-foreground

    Allerdings, wenn man da das Windowhandle bereits hat, kannst du auch per SendMessage einen WM_QUIT senden.
    Da es aber nicht immer ein MainWindowHandle geben muss, kann man das u.U. nicht durchführen.
    Lade dir mal den ProcessExplorer von Sysinternals und versuche deinen VLC-Prozess in den Fordergrund zu holen (rechte Maustaste auf dem Prozess). Wenn das nicht klappt, dann geht das so nicht mehr.

    Auch bei WPF-Anwendungen hat man da schlechte Karten, da diese ganz anders aufgebaut sind und kein Fensterhandle mehr haben.

    Sonntag, 7. März 2021 16:25
  • Hallo, danke für den Tipp mit dem.Vordergrund. Leider steck ich immer noch fest. Hab es mal ganz einfach probiert mit dem Strg+F4 um zu schauen ob sich alle Fenster schließen. Leider erfolglos. Ich hab euch mal die Fehler eingebaut, vielleicht besser zu erkennen was nicht passt. Danke euch :)

    PS C:\WINDOWS\system32> C:\Users\Name\Desktop\Unbenannt1.ps1 Ausnahme beim Aufrufen von "SendWait" mit 1 Argument(en): "Der angegebene Wiederholwert ist ungültig." In C:\Users\Name\Desktop\Unbenannt1.ps1:1 Zeichen:1 + [System.Windows.Forms.SendKeys]::SendWait("{% F4}") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentException PS C:\WINDOWS\system32> C:\Users\Name\Desktop\Unbenannt1.ps1 Ausnahme beim Aufrufen von "SendWait" mit 1 Argument(en): "Das Schlüsselwort %F4 ist ungültig." In C:\Users\Name\Desktop\Unbenannt1.ps1:11 Zeichen:1 + [System.Windows.Forms.SendKeys]::SendWait("{%F4}") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentException




    • Bearbeitet Engel4 Montag, 8. März 2021 11:33
    Montag, 8. März 2021 11:24
  • Anscheinend wird da was abgefangen, probiers mal mit Send("{%F4}") statt SendWait.
    Montag, 8. März 2021 11:47
  • Das macht leider keinen Unterschied, außer in der Fehlermeldung:

    PS C:\WINDOWS\system32> C:\Users\Name\Desktop\Unbenannt1.ps1
    Ausnahme beim Aufrufen von "Send" mit 1 Argument(en):  "SendKeys kann nicht innerhalb der Anwendung ausgeführt 
    werden, da diese Anwendung keine Windows-Meldungen verarbeitet. Ändern Sie die Anwendung so, dass sie Meldungen 
    behandelt, oder verwenden Sie die SendKeys.SendWait-Methode."
    In C:\Users\Name\Desktop\Unbenannt1.ps1:1 Zeichen:1
    + [System.Windows.Forms.SendKeys]::Send("{%F4}")
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : InvalidOperationException


    • Bearbeitet Engel4 Montag, 8. März 2021 17:06
    Montag, 8. März 2021 17:06
  • Also er sendet mir eine 44 im Anschluss: 

    PS C:\WINDOWS\system32> C:\Users\David\Desktop\Unbenannt1.ps1
    Ausnahme beim Aufrufen von "SendWait" mit 1 Argument(en):  "Das Schlüsselwort %F4 ist ungültig."
    In C:\Users\David\Desktop\Unbenannt1.ps1:1 Zeichen:2
    +  [System.Windows.Forms.SendKeys]::SendWait("{%F4}")
    +  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ArgumentException
     
    
    PS C:\WINDOWS\system32> 44

    Montag, 8. März 2021 17:13
  • Hallo zusammen, ich habe die Lösung gefunden. Ich habe jetzt dieses Skript verwendet:

    While((Get-date) -lt $End)
    $wsh = New-Object -ComObject WScript.Shell
    $wsh.AppActivate("VLC media player")
    $wsh.SendKeys('^{q}')

    Es funktioniert super und durch dieses Skript muss das Programm (in dem Fall VLC) nicht im Vordergrund sein. Das Key wird auch an das Programm im Hintergrund zugeschickt.

    Schönen Nachmittag

    Freitag, 16. April 2021 14:41
  • Sendkeys ist sehr unpräzise. Wenn sich ein anderes Fenster oder Popup dazwischenschiebt, schließt dein Script das.

    Das hier funktioniert auch und ist sicherer:

    Get-Process 'vlc' |   Foreach-Object { $_.CloseMainWindow() }

     

    Grüße, Denniver

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Samstag, 17. April 2021 10:49
    Moderator
  • Hallo zusammen, ich habe die Lösung gefunden. Ich habe jetzt dieses Skript verwendet:

    Es funktioniert super und durch dieses Skript muss das Programm (in dem Fall VLC) nicht im Vordergrund sein. Das Key wird auch an das Programm im Hintergrund zugeschickt.

    Ich weiß, das will keiner hören, aber wenn es Dir um die Steuerung von Programmen über deren Oberflächen geht, machst Du Dir das Leben viel leichter, wenn Du das richtige Tool dafür benutzt. AutoHotkey wurde für genau solche Szenarien entwickelt. Es gibt darin zum Beispiel Funktionen, mit denen man existierende Fenster in der Größe und Position nach Belieben beeinflussen kann.

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 17. April 2021 11:40
  • Oder auch Powerautomate Desktop;-).
    Montag, 19. April 2021 09:03