C# 顯示、隱藏窗口對應的任務欄
WPF中全屏窗口,會自動隱藏任務欄。
那非全屏窗口如何隱藏任務欄?甚至有沒有一種場景,隱藏任務後自定義一套系統任務欄來顯示?
以下會分階段講述一些概念,任務欄、查找窗口、控制窗口顯示。
1. 主屏任務欄
任務欄,其實也是一個窗口,主屏的任務欄名稱是”Shell_TrayWnd”。
所以可以通過名稱查找窗口,然後對窗口進行顯示、隱藏操作。
以下是主屏幕任務欄的控制操作:
public static class ScreenTaskBar { private const int SwHide = 0; //隱藏窗口 private const int SwRestore = 9;//還原窗口 [DllImport("user32.dll")] private static extern int ShowWindow(int hwnd, int nCmdShow); [DllImport("user32.dll")] private static extern int FindWindow(string lpClassName, string lpWindowName); /// <summary> /// 顯示任務欄 /// </summary> public static void Show() { ShowWindow(FindWindow("Shell_TrayWnd", null), SwRestore); } /// <summary> /// 隱藏任務欄 /// </summary> public static void Hide() { ShowWindow(FindWindow("Shell_TrayWnd", null), SwHide); } }
2.多屏任務欄
如果是多屏,對任務欄進行處理的場景,一般是對窗口所對應的任務欄操作。
如何獲取任意窗口所在的任務欄呢?既然任務欄也是窗口,那麼我們的關註點就是如何找到任務欄窗口瞭。
User32有EnumWindows函數,可以遍歷當前電腦的所有窗口。
private delegate bool EnumWindowProc(IntPtr hWnd, int lParam); [DllImport("user32")] private static extern bool EnumWindows(EnumWindowProc lpEnumFunc, int lParam);
EnumWindowProc定義瞭委托的處理。添加回調方法,返回的參數是句柄信息:
bool OnEnumWindow(IntPtr hWnd, int lparam) { //添加代碼XXX return true; }
然後可以在回調內部添加代碼,根據窗口的句柄信息,我們去拿窗口的一些信息,類名、窗口標題、窗口的Bounds(位置、大小)
[DllImport("user32")] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lptrString, int nMaxCount); [DllImport("user32")] private static extern bool GetWindowRect(IntPtr hWnd, ref LPRECT rect);
以下是部分遍歷出來的窗口類信息:
所以,可以篩選出那些以TrayWnd字符串結尾的,這些都是任務欄窗口。
之後就是如何篩選出我們想要的任務欄,即窗口對應的任務欄。
窗口與任務欄,是通過屏幕關聯在一起的。通過窗口獲取當前屏幕信息,任務欄的Bounds如果與屏幕Bounds相交,則說明此任務欄在此屏幕內。
var intPtr = new WindowInteropHelper(window).Handle;//獲取當前窗口的句柄 var screen = Screen.FromHandle(intPtr);//獲取當前屏幕 var currentScreenBounds = screen.Bounds; var taskBars = windows.Where(i => i.ClassName.Contains("TrayWnd")); var currentTaskBar = taskBars.FirstOrDefault(i => i.Bounds.IntersectsWith(currentScreenBounds));
獲取任務欄,也可以通過任務欄的句柄獲取屏幕,與主窗口所在屏幕判斷是否同一個。
獲取瞭指定的任務欄信息後,我們就可以控制任務欄顯示、隱藏瞭。調用下user32下函數ShowWindow即可:
private const int SwHide = 0; //隱藏窗口 private const int SwRestore = 9;//還原窗口 /// <summary> /// 通過句柄,窗體顯示函數 /// </summary> /// <param name="hWnd">窗體句柄</param> /// <param name="cmdShow">顯示方式</param> /// <returns>返回成功與否</returns> [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)] public static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
這裡的ShowWindow,與上面默認任務欄操作所調用的ShowWindow不一樣,句柄參數是IntPtr
到此這篇關於C# 顯示、隱藏窗口對應的任務欄的文章就介紹到這瞭,更多相關C# 顯示隱藏窗口任務欄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!