From d215bd0f40a12bc1e861185d519527d3cc6791bf Mon Sep 17 00:00:00 2001 From: theorangeone97 Date: Mon, 18 Aug 2014 12:54:00 +0100 Subject: [PATCH] code for hiding the taskbar --- USB Lockdown/taskbarController.cs | 144 ++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 USB Lockdown/taskbarController.cs diff --git a/USB Lockdown/taskbarController.cs b/USB Lockdown/taskbarController.cs new file mode 100644 index 0000000..4fc2f2a --- /dev/null +++ b/USB Lockdown/taskbarController.cs @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2008..11 by Simon Baer + * + * You may use this code for whatever you want. + */ + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace USB_Lockdown +{ + /// + /// Helper class for hiding/showing the taskbar and startmenu on + /// Windows XP and Vista. + /// + public static class Taskbar + { + [DllImport("user32.dll")] + private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam); + [DllImport("user32.dll", SetLastError = true)] + private static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName); + [DllImport("user32.dll", SetLastError = true)] + private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); + [DllImport("user32.dll")] + private static extern IntPtr FindWindowEx(IntPtr parentHwnd, IntPtr childAfterHwnd, IntPtr className, string windowText); + [DllImport("user32.dll")] + private static extern int ShowWindow(IntPtr hwnd, int nCmdShow); + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int lpdwProcessId); + + private const int SW_HIDE = 0; + private const int SW_SHOW = 5; + + private const string VistaStartMenuCaption = "Start"; + private static IntPtr vistaStartMenuWnd = IntPtr.Zero; + private delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam); + + /// + /// Show the taskbar. + /// + public static void Show() + { + SetVisibility(true); + } + + /// + /// Hide the taskbar. + /// + public static void Hide() + { + SetVisibility(false); + } + + /// + /// Sets the visibility of the taskbar. + /// + public static bool Visible + { + set { SetVisibility(value); } + } + + /// + /// Hide or show the Windows taskbar and startmenu. + /// + /// true to show, false to hide + private static void SetVisibility(bool show) + { + // get taskbar window + IntPtr taskBarWnd = FindWindow("Shell_TrayWnd", null); + + // try it the WinXP way first... + IntPtr startWnd = FindWindowEx(taskBarWnd, IntPtr.Zero, "Button", "Start"); + + if (startWnd == IntPtr.Zero) + { + // try an alternate way, as mentioned on CodeProject by Earl Waylon Flinn + startWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, "Start"); + } + + if (startWnd == IntPtr.Zero) + { + // ok, let's try the Vista easy way... + startWnd = FindWindow("Button", null); + + if (startWnd == IntPtr.Zero) + { + // no chance, we need to to it the hard way... + startWnd = GetVistaStartMenuWnd(taskBarWnd); + } + } + + ShowWindow(taskBarWnd, show ? SW_SHOW : SW_HIDE); + ShowWindow(startWnd, show ? SW_SHOW : SW_HIDE); + } + + /// + /// Returns the window handle of the Vista start menu orb. + /// + /// windo handle of taskbar + /// window handle of start menu + private static IntPtr GetVistaStartMenuWnd(IntPtr taskBarWnd) + { + // get process that owns the taskbar window + int procId; + GetWindowThreadProcessId(taskBarWnd, out procId); + + Process p = Process.GetProcessById(procId); + if (p != null) + { + // enumerate all threads of that process... + foreach (ProcessThread t in p.Threads) + { + EnumThreadWindows(t.Id, MyEnumThreadWindowsProc, IntPtr.Zero); + } + } + return vistaStartMenuWnd; + } + + /// + /// Callback method that is called from 'EnumThreadWindows' in 'GetVistaStartMenuWnd'. + /// + /// window handle + /// parameter + /// true to continue enumeration, false to stop it + private static bool MyEnumThreadWindowsProc(IntPtr hWnd, IntPtr lParam) + { + StringBuilder buffer = new StringBuilder(256); + if (GetWindowText(hWnd, buffer, buffer.Capacity) > 0) + { + Console.WriteLine(buffer); + if (buffer.ToString() == VistaStartMenuCaption) + { + vistaStartMenuWnd = hWnd; + return false; + } + } + return true; + } + } +}