Windowstyle während des noch laufenden Prozesses ändern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von xd-franky-5.

    Windowstyle während des noch laufenden Prozesses ändern

    Hallo :)
    Ich starte eine einen Prozess mit ​startInfo.WindowStyle = ProcessWindowStyle.Hidden. Ich möchte aber später den Windowstyle wieder auf normal setzen, geht das ? Google hat mir leider nur Unfug ausgespuckt.

    Danke schon mal im Voraus.
    Kurzfassung:
    Process.Start gibt dir eine Prozess-Instanz zurück.
    Die hat eine Property MainWindowHandle.
    Mit dieser kannst du mittels der WinApi-Funktion ShowWindow das Fenster auf ShowNormal oder ShowMaximized setzen.

    Falls dir das nicht reicht, melde dich nochmals.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. ​Private Declare Function ShowWindow Lib "user32" (ByVal handle As IntPtr, ByVal nCmdShow As Integer) As Integer
    2. Sub ShowAppWindow()
    3. Dim localByName As Process() = Process.GetProcessesByName("iTunes")
    4. For Each p As Process In localByName
    5. ShowWindow(p.MainWindowHandle, 5) ' 5 wäre jetzt show
    6. Next
    7. End Sub
    Zum einen hätte ich die .Net-Signatur genommen.
    pinvoke.net/default.aspx/user32.showwindow

    Zum andern hätte ich das Handle nicht gesucht, weil es schon da ist.

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    2. Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
    3. End Function
    4. ...
    5. Dim Prc As New Process
    6. Prc.StartInfo = ---
    7. Prc.Start ...
    8. Dim Changed = ShowWindow(Prc.MainWindowHandle, 5)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Also wenn ich das mit dem bereits vorhandenen pr as process mache, kommt, dass der Prozess bereits beendet wurde, was aber nicht stimmt. Wenn ich das mit dem Suchen mache und halt mit dem Dllimport, komm wieder nichts.
    Schaut euch mal den Wert von Prc.MainWindowHandle an, weil das Fenster minimiert hidden ist, wirst du wohl IntPtr.Zero zurück kriegen. Also das Fenster mit FindWindow(-ex) suchen dann wird es gehen.

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

    xd-franky-5 schrieb:

    komm wieder nichts.
    Teste dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    4. Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
    5. End Function
    6. Enum ShowWindowCommands As Integer
    7. Hide = 0
    8. Normal = 1
    9. ShowMinimized = 2
    10. Maximize = 3
    11. ShowMaximized = 3
    12. ShowNoActivate = 4
    13. Show = 5
    14. Minimize = 6
    15. ShowMinNoActive = 7
    16. ShowNA = 8
    17. Restore = 9
    18. ShowDefault = 10
    19. ForceMinimize = 11
    20. End Enum
    21. Dim MainWnd As IntPtr
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. Dim pr = Process.Start("Notepad.exe")
    24. pr.WaitForInputIdle()
    25. MainWnd = pr.MainWindowHandle
    26. End Sub
    27. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    28. ShowWindow(MainWnd, ShowWindowCommands.Maximize)
    29. End Sub
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. ShowWindow(MainWnd, ShowWindowCommands.Minimize)
    32. End Sub
    33. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    34. ShowWindow(MainWnd, ShowWindowCommands.Normal)
    35. End Sub
    36. 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!
    @Murdock Jou.
    @xd-franky-5 Das geht nicht, da das MainWindowHandle dieses unsichtbaren Prozesses NULL (IntPtr.Zero) ist.

    Du musst das Programm visible starten und unmittelbar nach dem Start auf hide setzen, starte es minimiert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    4. Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
    5. End Function
    6. Enum ShowWindowCommands As Integer
    7. Hide = 0
    8. Normal = 1
    9. ShowMinimized = 2
    10. Maximize = 3
    11. ShowMaximized = 3
    12. ShowNoActivate = 4
    13. Show = 5
    14. Minimize = 6
    15. ShowMinNoActive = 7
    16. ShowNA = 8
    17. Restore = 9
    18. ShowDefault = 10
    19. ForceMinimize = 11
    20. End Enum
    21. Dim MainWnd As IntPtr
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. Dim pr = New Process
    24. pr.StartInfo.FileName = "Notepad.exe"
    25. 'pr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    26. pr.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
    27. pr.Start()
    28. pr.WaitForInputIdle()
    29. MainWnd = pr.MainWindowHandle
    30. ShowWindow(MainWnd, ShowWindowCommands.Hide)
    31. End Sub
    32. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    33. ShowWindow(MainWnd, ShowWindowCommands.Maximize)
    34. End Sub
    35. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    36. ShowWindow(MainWnd, ShowWindowCommands.Minimize)
    37. End Sub
    38. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    39. ShowWindow(MainWnd, ShowWindowCommands.Normal)
    40. End Sub
    41. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    42. ShowWindow(MainWnd, ShowWindowCommands.Hide)
    43. End Sub
    44. 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!
    Mit FindWindow(-Ex) bekommt man trotzdem ein gültiges Fensterhandle, der Prozess muss nicht zwingend sichtbar gestartet werden.

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

    Murdock schrieb:

    FindWindow(-Ex)
    Jou.

    VB.NET-Quellcode

    1. <DllImport("user32.dll", CharSet:=CharSet.Unicode)> _
    2. Public Shared Function FindWindowEx(parentHandle As IntPtr, childAfter As IntPtr, className As String, windowTitle As String) As IntPtr
    3. End Function
    4. Dim MainWnd As IntPtr
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim pr = New Process
    7. pr.StartInfo.FileName = "Notepad.exe"
    8. pr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    9. 'pr.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
    10. pr.Start()
    11. pr.WaitForInputIdle()
    12. 'MainWnd = pr.MainWindowHandle
    13. 'ShowWindow(MainWnd, ShowWindowCommands.Hide)
    14. MainWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, Nothing, "Unbenannt - Editor")
    15. End Sub
    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!