Created
April 15, 2025 14:34
-
-
Save ratozumbi/461184add2ac3be2578d80987ff7703a to your computer and use it in GitHub Desktop.
Hide/Show Windows taskbar (Unity3D)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Text; | |
| using System.Runtime.InteropServices; | |
| using System.Diagnostics; | |
| namespace Util | |
| { | |
| /// <summary> | |
| /// Helper class for hiding/showing the taskbar and startmenu on | |
| /// Windows XP and Vista. | |
| /// </summary> | |
| 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 StartMenuCaption = "Start"; | |
| private static IntPtr vistaStartMenuWnd = IntPtr.Zero; | |
| private delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam); | |
| /// <summary> | |
| /// Show the taskbar. | |
| /// </summary> | |
| public static void Show() | |
| { | |
| SetVisibility(true); | |
| } | |
| /// <summary> | |
| /// Hide the taskbar. | |
| /// </summary> | |
| public static void Hide() | |
| { | |
| SetVisibility(false); | |
| } | |
| /// <summary> | |
| /// Sets the visibility of the taskbar. | |
| /// </summary> | |
| public static bool Visible | |
| { | |
| set { SetVisibility(value); } | |
| } | |
| /// <summary> | |
| /// Hide or show the Windows taskbar and startmenu. | |
| /// </summary> | |
| /// <param name="show">true to show, false to hide</param> | |
| private static void SetVisibility(bool show) | |
| { | |
| // get taskbar window | |
| IntPtr taskBarWnd = FindWindow("Shell_TrayWnd", null); | |
| IntPtr taskBarWnd2 = FindWindow("Shell_SecondaryTrayWnd", null); | |
| // try it the WinXP way first... | |
| //IntPtr startWnd = FindWindowEx(taskBarWnd, IntPtr.Zero, "Button", "Start"); | |
| IntPtr startWnd = GetStartMenuWnd(taskBarWnd); | |
| ShowWindow(taskBarWnd, show ? SW_SHOW : SW_HIDE); | |
| ShowWindow(taskBarWnd2, show ? SW_SHOW : SW_HIDE); //monitor 2 | |
| ShowWindow(startWnd, show ? SW_SHOW : SW_HIDE); | |
| } | |
| /// <summary> | |
| /// Returns the window handle of the start menu button. | |
| /// </summary> | |
| /// <param name="taskBarWnd">windo handle of taskbar</param> | |
| /// <returns>window handle of start menu</returns> | |
| private static IntPtr GetStartMenuWnd(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; | |
| } | |
| /// <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 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() == StartMenuCaption) | |
| { | |
| vistaStartMenuWnd = hWnd; | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment