Taskleiste Fenster schließen!

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    Taskleiste Fenster schließen!

    Moin! :)
    Ich möchte gerne alle Fenster die in der Taskleiste sind, per Klick Beenden.
    Wie man eine Prozess Beendet, weiß ich bereits.
    Aber ich möchte auch, alle Fenster schließen.
    Würde mich sehr auf Hilfe freuen.
    BIG THX
    Visual Basic.NET 8o
    MS-SQL
    8o
    Schließt sich das zum Prozess gehörende Fenster nicht wenn man selbigen beendet?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo Falsche Herangehensweise.
    Der Prozess soll sich nach Möglichkeit freiwillig beenden.
    @Cheffboss Probier mal dies:

    VB.NET-Quellcode

    1. Dim proc() = Process.GetProcessesByName("Notepad")
    2. If proc.Length > 0 Then
    3. proc(0).CloseMainWindow()
    4. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @an alle beide
    Vielen Dank, für eure Antwort. :thumbup:
    Die Methode mit Process.GetProcessesByName(), kenne ich bereits.
    Gibt es keine andere Möglichkeit, wenn man nur die Taskleiste leeren möchte?
    Wenn man den Prozess noch nicht per Namen kennt.
    Im Notfall muss ich eben alle wichtigen Prozesse per Namen beenden, und hoffen dass die Taskleiste dann leer wird.
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Du iterierst alle Prozesse durch, und nur die, die ein MainWindow haben (.MainWindowHandle <> IntPtr.Zero) machst Du zu.
    Da sollte Dein Programm auch bei rausfliegen.
    docs.microsoft.com/de-de/dotne…dle?view=netframework-4.8
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ermittle das (kleinste) Handle der Explorer.exe.
    Töte alle Prozesse, die dieses Handle als Parent Window haben.

    Schau dir die Struktur mit dem ProcessMonitor von SysInternals an.
    Da gibt's oben ein Icon "Show Process Tree".
    Da siehst du die Prozessstruktur.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Moin! :)
    Ich habe die Funktion soweit programmiert.
    Aber leider kann man nicht so einfach ermitteln, welcher Explorerfenster gerade geöffnet ist.
    Habe nun das ganze Internet durchsucht.
    Leider kann man den Explorer Prozess nur ganz beenden, da man leider nicht so einfach - oder vielleicht auch gar nicht auslesen kann.
    Was meint Ihr, kann man das Explorer-Fenster gezielt auslesen und beenden? :?:
    Außerdem habe ich den Befehl „Kill“ genommen.
    Ich weiß das dieser Befehle etwas brutal ist, aber so beendet er das Programm von selbst. - Wenn man zum Beispiel ein MS-Word Dokument geöffnet hat. - Und es sofort beenden möchte.
    Schaut euch mal bitte meine Lösung an.
    Kann ich den Code so belassen?
    Oder sollte ich den Code noch verbessern?
    BIG THX

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim p As System.Diagnostics.Process
    3. For Each p In System.Diagnostics.Process.GetProcesses()
    4. If Not p.ProcessName = Application.ProductName Then
    5. If p.ProcessName = "explorer" Then
    6. p.Kill()
    7. ElseIf Not IntPtr.Zero.Equals(p.MainWindowHandle) Then
    8. p.Kill()
    9. End If
    10. Me.ListView1.Items.Add(p.ProcessName).SubItems.Add(p.MainWindowTitle)
    11. End If
    12. Next
    13. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    Zeile#5 und #7 kannst Du zusammenfassen zu:

    VB.NET-Quellcode

    1. If p.ProcessName = "explorer" OrElse Not IntPtr.Zero.Equals(p.MainWindowHandle) Then 'oder eben p.MainWindowHandle <> IntPtr.Zero

    Dein Programm würde ich nie auf meinem PC laufen lassen. Das gewissenlose Prozesskillen ist ein Garant für unkontrollierten Datenverlust.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Danke, für die Verbesserung des Codes. :)
    Mein Programm gibt dem User die Information, das alle
    Fenster und Programme geschloßen werden.
    Und nur bei Bestätigung, wird das ausgeführt, sonst wird der Vorgang
    einfach abgebrochen!
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Trotzdem solltest Du dem Prozess Gelegenheit geben, sich selbst ordentlich mit .CloseMainWindow() zu beenden.
    Dann solltest Du eine kleine Pause einlegen, minimal 1 Sekunde, um dem Prozess Gelegenheit zu geben, sich zu beenden.
    Falls da viele Fernster offen sind und Du jedem Prozess die Sekunde gibst, mach das ganze mit .Parallel.ForEach().
    docs.microsoft.com/de-de/dotne…ach?view=netframework-4.8
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich habe es nun so gelöst…
    Beim Windows-Explorer gibt es keine Fenster, diese man direkt beenden kann.
    Deshalb muss dort leider ein Kill Befehl sein!
    Falls das Programm kein Windows-Explorer ist, wird zuerst versucht das Fenster normal zu schließen.
    Falls das nicht geht, eben ein Kill.
    Aber zuerst wird versucht die Fenster normal zu schließen.
    Ich wollte ein kleines Sleep einbauen, zwischen CloseMainWindows und Kill.
    Aber dann erscheint eine seltsame Fehlermeldung!
    Dieser Code wird nur ausgeführt wenn der Benutzer dieses erlaubt hat!
    Welche Code-Variante ist die bessere? ?(

    Code1:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim p As System.Diagnostics.Process
    3. For Each p In System.Diagnostics.Process.GetProcesses()
    4. If Not p.ProcessName = Application.ProductName Then
    5. If Not IntPtr.Zero.Equals(p.MainWindowHandle) Then
    6. If p.ProcessName = "explorer" Then
    7. p.Kill()
    8. Else
    9. p.CloseMainWindow()
    10. p.Kill()
    11. End If
    12. End If
    13. Me.ListView1.Items.Add(p.ProcessName).SubItems.Add(p.MainWindowTitle)
    14. End If
    15. Next
    16. End Sub


    Code2:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim p As System.Diagnostics.Process
    3. For Each p In System.Diagnostics.Process.GetProcesses()
    4. If Not p.ProcessName = Application.ProductName Then
    5. If p.ProcessName = "explorer" OrElse Not IntPtr.Zero.Equals(p.MainWindowHandle) Then
    6. p.Kill()
    7. End If
    8. Me.ListView1.Items.Add(p.ProcessName).SubItems.Add(p.MainWindowTitle)
    9. End If
    10. Next
    11. End Sub

    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cheffboss“ ()

    Cheffboss schrieb:

    Aber dann erscheint eine seltsame Fehlermeldung!
    Welche in welchre Zeile bei welchem Programm?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Cheffboss Kopier mal den Inhalt des unteren Fensters raus.
    In dieser Zeile:

    VB.NET-Quellcode

    1. Me.ListView1.Items.Add(p.ProcessName).SubItems.Add(p.MainWindowTitle)
    :?:
    Setz da nen Haltepunkt drauf und untersuch das Element.
    Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Inhalt ist so wie er sein sollte.
    Habe auch bereits diesen teil auskommentiert.
    Sobald ich ein System.Threading.Thread.Sleep(500) einfüge,
    kommt diese Fehlermeldung!
    Ich werde mit Code2 weiter arbeiten.
    Da erscheint keine Fehlermeldung!
    Nochmals Danke, an euch alle! ^^
    Visual Basic.NET 8o
    MS-SQL
    8o
    Das Problem taucht ja beim Aufruf von Kill auf, siehe Fehlermeldungsstack/Funktionsaufrufstack. Kill kann nur auf einen Prozess verwendet werden, der noch existiert. Wenn der CloseMainWindow zum Ziel führt, braucht es kein Kill mehr. Von daher: Nach CloseMainWindow prüfen, ob der Prozess nach ca. 1 Sekunde noch existiert. Wenn ja, dann Kill, sonst nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @an alle
    Ich habe festgestellt dass mein Code alle Prozesse und aktive Fenster beendet.
    So wie ich es haben möchte!
    Aber wenn ein Einstellungsfenster (Siehe Bild) zum Beispiel „Benutzer und Kennwörter“ geöffnet ist.
    Wird dieses nicht geschlossen, sondern bleicht einfach offen!
    Wenn ich die rundll32.exe Datei beende, werden auch alle Einstellungsfenster geschlossen.
    Kann man einfach diese Datei beenden, oder macht diese Probleme?
    Beim Testen, ging alles gut!
    Was meint Ihr kann man diese Datei beenden? ?(

    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Wenn ich die rundll32.exe Datei beende, werden auch alle Einstellungsfenster geschlossen.
    Wie beendest Du diese?
    Kill() oder CloseMainWindow()?
    CloseMainWindow() sollte keine Probleme bringen, das ist wie Klicken auf das Kreuz [X] rechts oben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!