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;
+ }
+ }
+}