#Region " Taskbar Hide-Show "
' [ Taskbar Hide-Show]
'
' Examples :
'
' Taskbar.Hide()
' Taskbar.Show()
#End Region
' Taskbar.vb
#Region " Taskbar Class "
''' <summary>
''' Helper class for hiding/showing the taskbar and startmenu on
''' Windows XP and Vista.
''' </summary>
Public Class Taskbar
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function GetWindowText(hWnd As IntPtr, text As System.Text.StringBuilder, count As Integer) As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function EnumThreadWindows(threadId As Integer, pfnEnum As EnumThreadProc, lParam As IntPtr) As Boolean
End Function
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function FindWindow(lpClassName As String, lpWindowName As String) As System.IntPtr
End Function
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function FindWindowEx(parentHandle As IntPtr, childAfter As IntPtr, className As String, windowTitle As String) As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function FindWindowEx(parentHwnd As IntPtr, childAfterHwnd As IntPtr, className As IntPtr, windowText As String) As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function ShowWindow(hwnd As IntPtr, nCmdShow As Integer) As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function GetWindowThreadProcessId(hwnd As IntPtr, lpdwProcessId As Integer) As UInteger
End Function
Private Const SW_HIDE As Integer = 0
Private Const SW_SHOW As Integer = 5
Private Const VistaStartMenuCaption As String = "Start"
Private Shared vistaStartMenuWnd As IntPtr = IntPtr.Zero
Private Delegate Function EnumThreadProc(hwnd As IntPtr, lParam As IntPtr) As Boolean
''' <summary>
''' Show the taskbar.
''' </summary>
Public Shared Sub Show()
SetVisibility(True)
End Sub
''' <summary>
''' Hide the taskbar.
''' </summary>
Public Shared Sub Hide()
SetVisibility(False)
End Sub
''' <summary>
''' Sets the visibility of the taskbar.
''' </summary>
Private Shared WriteOnly Property Visible() As Boolean
Set(value As Boolean)
SetVisibility(value)
End Set
End Property
''' <summary>
''' Hide or show the Windows taskbar and startmenu.
''' </summary>
''' <param name="show">true to show, false to hide</param>
Private Shared Sub SetVisibility(show As Boolean)
' get taskbar window
Dim taskBarWnd As IntPtr = FindWindow("Shell_TrayWnd", Nothing)
' Try the Windows XP TaskBar:
Dim startWnd As IntPtr = FindWindowEx(taskBarWnd, IntPtr.Zero, "Button", "Start")
If startWnd = IntPtr.Zero Then
' Try an alternate way of Windows XP TaskBar:
startWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, CType(&HC017, IntPtr), "Start")
End If
If startWnd = IntPtr.Zero Then
' Try the Windows Vista/7 TaskBar:
startWnd = FindWindow("Button", Nothing)
If startWnd = IntPtr.Zero Then
' Try an alternate way of Windows Vista/7 TaskBar:
startWnd = GetVistaStartMenuWnd(taskBarWnd)
End If
End If
ShowWindow(taskBarWnd, If(show, SW_SHOW, SW_HIDE))
ShowWindow(startWnd, If(show, SW_SHOW, SW_HIDE))
End Sub
''' <summary>
''' Returns the window handle of the Vista start menu orb.
''' </summary>
''' <param name="taskBarWnd">windo handle of taskbar</param>
''' <returns>window handle of start menu</returns>
Private Shared Function GetVistaStartMenuWnd(taskBarWnd As IntPtr) As IntPtr
' get process that owns the taskbar window
Dim procId As Integer
GetWindowThreadProcessId(taskBarWnd, procId)
Dim p As Process = Process.GetProcessById(procId)
If p IsNot Nothing Then
' enumerate all threads of that process...
For Each t As ProcessThread In p.Threads
EnumThreadWindows(t.Id, AddressOf MyEnumThreadWindowsProc, IntPtr.Zero)
Next
End If
Return vistaStartMenuWnd
End Function
''' <summary>
''' Callback method that is called from 'EnumThreadWindows' in 'GetVistaStartMenuWnd'.
''' </summary>
''' <param name="hWnd">window handle</param>
''' <param name="lParam">parameter</param>
''' <returns>true to continue enumeration, false to stop it</returns>
Private Shared Function MyEnumThreadWindowsProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
Dim buffer As New System.Text.StringBuilder(256)
If GetWindowText(hWnd, buffer, buffer.Capacity) > 0 Then
Console.WriteLine(buffer)
If buffer.ToString() = VistaStartMenuCaption Then
vistaStartMenuWnd = hWnd
Return False
End If
End If
Return True
End Function
End Class
#End Region