Externes Programm in Taskleiste verstecken

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Murdock.

    Externes Programm in Taskleiste verstecken

    Hallo zusammen,

    in Anlehnung an diesen Beitrag versuche ich ein externes Programm zu 'verstecken'.
    Das gelingt auch wie folgt:

    VB.NET-Quellcode

    1. Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As SHOW_WINDOW) As Boolean
    2. Private Enum SHOW_WINDOW As Integer
    3. SW_HIDE = 0
    4. SW_SHOWNORMAL = 1
    5. SW_NORMAL = 1
    6. SW_SHOWMINIMIZED = 2
    7. SW_SHOWMAXIMIZED = 3
    8. SW_MAXIMIZE = 3
    9. SW_SHOWNOACTIVATE = 4
    10. SW_SHOW = 5
    11. SW_MINIMIZE = 6
    12. SW_SHOWMINNOACTIVE = 7
    13. SW_SHOWNA = 8
    14. SW_RESTORE = 9
    15. SW_SHOWDEFAULT = 10
    16. SW_FORCEMINIMIZE = 11
    17. SW_MAX = 11
    18. End Enum
    19. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    20. For Each p As Process In Process.GetProcessesByName("NAME")
    21. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_HIDE)
    22. Next
    23. End Sub


    Um das Programm nun wieder anzuzeigen, auch in der Taskleiste, habe ich folgendes versucht:

    VB.NET-Quellcode

    1. Private Sub NotifyIcon1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
    2. For Each p As Process In Process.GetProcessesByName("NAME")
    3. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_SHOW)
    4. Next
    5. End Sub


    Auch andere Optionen in der Enumeration

    Quellcode

    1. SHOW_WINDOW
    werden konsequent ignoriert.

    Wie kann man dieses Programm also wieder anzeigen?


    Viele Grüße,
    Hitch

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

    Hitch schrieb:

    Auch andere Optionen
    Hast Du die alle ausprobiert?
    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!
    OK - Habe jetzt eine annehmbare Lösung gefunden:

    VB.NET-Quellcode

    1. Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As SHOW_WINDOW) As Boolean
    2. Dim sp As New ArrayList
    3. Dim programname As String = "NAME"
    4. Private Enum SHOW_WINDOW As Integer
    5. SW_HIDE = 0
    6. SW_SHOWNORMAL = 1
    7. SW_NORMAL = 1
    8. SW_SHOWMINIMIZED = 2
    9. SW_SHOWMAXIMIZED = 3
    10. SW_MAXIMIZE = 3
    11. SW_SHOWNOACTIVATE = 4
    12. SW_SHOW = 5
    13. SW_MINIMIZE = 6
    14. SW_SHOWMINNOACTIVE = 7
    15. SW_SHOWNA = 8
    16. SW_RESTORE = 9
    17. SW_SHOWDEFAULT = 10
    18. SW_FORCEMINIMIZE = 11
    19. SW_MAX = 11
    20. End Enum
    21. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    22. hide_program
    23. End Sub
    24. Private Sub NotifyIcon1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
    25. show_program()
    26. End Sub
    27. Private Sub hide_program()
    28. For Each p As Process In Process.GetProcessesByName(programname)
    29. sp.Add(p)
    30. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_HIDE)
    31. Next
    32. End Sub
    33. Private Sub show_program()
    34. For Each p As Process In sp
    35. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_RESTORE)
    36. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_SHOW)
    37. ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_SHOWNORMAL)
    38. Next
    39. sp.Clear()
    40. End Sub


    Gibt's hierzu evtl. Anmerkungen?
    Ich würde eher auf eine List of(T) zurückgreifen, die ArrayList ist glaub ich veraltet. Der Grund warum das Fenster nicht wieder angezeigt wurde, ist das Process.MainWindowHandle IntPtr.Zero zurückgibt, wenn das Fenster "Hidden" ist. Also ent6weder in einer List of T die Handles sichern oder mit FindWindow das Fenster suchen. Da auch mal etwas schief gehen kann bei Api Calls, wäre es sinnvoll, den zurück gegebenen Boolean von ShowWindow auch auszuwerten, wenn das Fenster nämlich nicht gezeigt wird, ist deine Liste leer.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private l As New List(Of IntPtr)
    4. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    5. Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
    6. End Function
    7. Enum ShowWindowCommands As Integer
    8. Hide = 0
    9. Normal = 1
    10. ShowMinimized = 2
    11. Maximize = 3
    12. ShowMaximized = 3
    13. ShowNoActivate = 4
    14. Show = 5
    15. Minimize = 6
    16. ShowMinNoActive = 7
    17. ShowNA = 8
    18. Restore = 9
    19. ShowDefault = 10
    20. ForceMinimize = 11
    21. End Enum
    22. Private Sub BTN_HIDE_Click(sender As Object, e As EventArgs) Handles BTN_HIDE.Click
    23. For Each p As Process In Process.GetProcessesByName("notepad")
    24. If ShowWindow(p.MainWindowHandle, ShowWindowCommands.Hide) Then
    25. l.Add(p.MainWindowHandle)
    26. End If
    27. Next
    28. End Sub
    29. Private Sub NOIC_DoubleClick(sender As Object, e As EventArgs) Handles NOIC.DoubleClick
    30. Dim intptrs() As IntPtr = l.ToArray
    31. For i = 0 To intptrs.Length - 1
    32. If ShowWindow(intptrs(i), ShowWindowCommands.Show) Then
    33. l.Remove(intptrs(i))
    34. End If
    35. Next
    36. End Sub
    37. End Class