Externes Programm maximiert starten

  • VB.NET
  • .NET 5–6

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Gockel67.

    Externes Programm maximiert starten

    Moin Gemeinde,

    nach über 20 Jahren komme ich wieder in die Verlegenheit etwas programmieren zu müssen. Das letzte mal war noch mit VB6.
    Hab das Programm auch am laufen (vieles aus dem Internet abgekupfert). Eine Kleinigkeit bräuchte ich aber noch die ich im
    Netz nicht finde.

    Icch starte mit folgendem Code ein externes Programm:

    VB.NET-Quellcode

    1. Dim oProcess As Process
    2. Me.WindowState = FormWindowState.Minimized
    3. oProcess = System.Diagnostics.Process.Start(FormEinstellungen.PrgPfad1.Text)
    4. ' Warten, bis der Prozess beendet wurde
    5. oProcess.WaitForExit()
    6. Me.WindowState = FormWindowState.Maximized

    Wie muss der Code aussehen damit das externe Programm maximiert startet?

    Greetings und schönes Wochenende

    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du kannst Dir das Handle des Zielfensters schnappen und mit UIAutomation über das WindowPattern das Zielfenster maximieren. Geht aber bestimmt auch LowLevel-mäßig über P/Invoke.
    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.
    @Gockel67 Willkommen im Forum. :thumbup:
    Mit Framework kein Akt, NET6 ist da anders.
    @VaporiZed meint dies (getestet):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll")>
    4. Private Shared Function ShowWindow(hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)> nCmdShow As ShowWindowCommands) As <MarshalAs(UnmanagedType.Bool)> Boolean
    5. End Function
    6. Private Enum ShowWindowCommands
    7. SW_HIDE = 0
    8. SW_SHOWNORMAL = 1
    9. SW_SHOWMINIMIZED = 2
    10. SW_SHOWMAXIMIZED = 3
    11. SW_MAXIMIZE = 3
    12. SW_SHOWNOACTIVATE = 4
    13. SW_SHOW = 5
    14. SW_MINIMIZE = 6
    15. SW_SHOWMINNOACTIVE = 7
    16. SW_SHOWNA = 8
    17. SW_RESTORE = 9
    18. End Enum
    19. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    20. Dim psi = New ProcessStartInfo("Notepad.exe")
    21. 'psi.WindowStyle = ProcessWindowStyle.Maximized
    22. Dim pr = Process.Start(psi)
    23. pr.WaitForInputIdle()
    24. ShowWindow(pr.MainWindowHandle, ShowWindowCommands.SW_MAXIMIZE)
    25. End Sub
    26. End Class
    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!
    Hm …
    Allzu viel kann man eigentlich nicht falsch machen. Probiere das hiesige Testprojekt und sag, ob das klappt. Wenn ja, finde den relevanten Unterschied zu Deinem Test. Wenn nein, stimmt irgendwas grundsätzlich nicht.
    Dateien
    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.

    Gockel67 schrieb:

    Das Beispiel funktioniert bei mir leider nicht.
    Ich habe den Code mit und ohne Framework probiert.
    Mit welcher Umgebung arbeitest Du tatsächlich?
    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!

    Gockel67 schrieb:

    Windows 11 22H2
    AHa, Windows 11.
    Damit kann ich nicht dienen. Sorry.
    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!
    Was passiert, wenn Du die App mit Administratorrechten öffnest? Vielleicht in Win11 restriktiver.
    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.
    Benutze das Exited-Event

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim WithEvents Btn As New Button With {.Dock = DockStyle.Bottom, .Text = "Start Notepad", .Height = 30, .Parent = Me}
    3. Private Sub Btn_MouseDown(sender As Object, e As MouseEventArgs) Handles Btn.MouseDown
    4. Dim psi As New ProcessStartInfo("notepad") With {.WindowStyle = ProcessWindowStyle.Maximized, .UseShellExecute = True}
    5. Dim pc = Process.Start(psi)
    6. pc.EnableRaisingEvents = True
    7. AddHandler pc.Exited, AddressOf PrgExited
    8. End Sub
    9. Private Sub PrgExited(sender As Object, e As EventArgs)
    10. MessageBox.Show("Notepad wurde geschlossen!")
    11. End Sub
    12. End Class


    MFG GPM
    Danke für deine Hilfe GPM, aber so wartet das Programm nicht auf den aufrufenden Prozess.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Me.WindowState = FormWindowState.Minimized
    3. Dim psi As New ProcessStartInfo("notepad") With {.WindowStyle = ProcessWindowStyle.Maximized, .UseShellExecute = True}
    4. Dim pc = Process.Start(psi)
    5. pc.EnableRaisingEvents = True
    6. AddHandler pc.Exited, AddressOf PrgExited
    7. Me.WindowState = FormWindowState.Maximized
    8. End Sub
    9. Private Sub PrgExited(sender As Object, e As EventArgs)
    10. MessageBox.Show("Notepad wurde geschlossen!")
    11. End Sub


    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Dann schieb die Me.WindowState = FormWindowState.Maximized-Zeile in die PrgExited-Methode, z.B. nach der MessageBox.Show-Zeile. Dann wird Dein Form maximiert, wenn das andere Programm geschlossen wurde.
    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.
    Ein Jurist hätte die ExceptionMeldung vermutlich nicht besser ausdrücken können, aber verkürzt könnte man es auch als Threadunfall oder -kollision bezeichnen. Ob die drei Compilerwarnungen jetzt in diesem Fehlerkontext generiert worden sind, weiß ich nicht, wenn nicht, dann befindet sich die Anwendung mit diesen Warnungen vermutlich in einem Zustand, der auch nicht ignoriert werden sollte.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.