C# 顯示、隱藏窗口對應(yīng)的任務(wù)欄
WPF中全屏窗口,會自動隱藏任務(wù)欄。
那非全屏窗口如何隱藏任務(wù)欄?甚至有沒有一種場景,隱藏任務(wù)后自定義一套系統(tǒng)任務(wù)欄來顯示?
以下會分階段講述一些概念,任務(wù)欄、查找窗口、控制窗口顯示。
1. 主屏任務(wù)欄
任務(wù)欄,其實(shí)也是一個窗口,主屏的任務(wù)欄名稱是"Shell_TrayWnd"。
所以可以通過名稱查找窗口,然后對窗口進(jìn)行顯示、隱藏操作。
以下是主屏幕任務(wù)欄的控制操作:
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> /// 顯示任務(wù)欄 /// </summary> public static void Show() { ShowWindow(FindWindow("Shell_TrayWnd", null), SwRestore); } /// <summary> /// 隱藏任務(wù)欄 /// </summary> public static void Hide() { ShowWindow(FindWindow("Shell_TrayWnd", null), SwHide); } }
2.多屏任務(wù)欄
如果是多屏,對任務(wù)欄進(jìn)行處理的場景,一般是對窗口所對應(yīng)的任務(wù)欄操作。
如何獲取任意窗口所在的任務(wù)欄呢?既然任務(wù)欄也是窗口,那么我們的關(guān)注點(diǎn)就是如何找到任務(wù)欄窗口了。
User32有EnumWindows函數(shù),可以遍歷當(dāng)前電腦的所有窗口。
private delegate bool EnumWindowProc(IntPtr hWnd, int lParam); [DllImport("user32")] private static extern bool EnumWindows(EnumWindowProc lpEnumFunc, int lParam);
EnumWindowProc定義了委托的處理。添加回調(diào)方法,返回的參數(shù)是句柄信息:
bool OnEnumWindow(IntPtr hWnd, int lparam) { //添加代碼XXX return true; }
然后可以在回調(diào)內(nèi)部添加代碼,根據(jù)窗口的句柄信息,我們?nèi)ツ么翱诘囊恍┬畔?,類名、窗口?biāo)題、窗口的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字符串結(jié)尾的,這些都是任務(wù)欄窗口。
之后就是如何篩選出我們想要的任務(wù)欄,即窗口對應(yīng)的任務(wù)欄。
窗口與任務(wù)欄,是通過屏幕關(guān)聯(lián)在一起的。通過窗口獲取當(dāng)前屏幕信息,任務(wù)欄的Bounds如果與屏幕Bounds相交,則說明此任務(wù)欄在此屏幕內(nèi)。
var intPtr = new WindowInteropHelper(window).Handle;//獲取當(dāng)前窗口的句柄 var screen = Screen.FromHandle(intPtr);//獲取當(dāng)前屏幕 var currentScreenBounds = screen.Bounds; var taskBars = windows.Where(i => i.ClassName.Contains("TrayWnd")); var currentTaskBar = taskBars.FirstOrDefault(i => i.Bounds.IntersectsWith(currentScreenBounds));
獲取任務(wù)欄,也可以通過任務(wù)欄的句柄獲取屏幕,與主窗口所在屏幕判斷是否同一個。
獲取了指定的任務(wù)欄信息后,我們就可以控制任務(wù)欄顯示、隱藏了。調(diào)用下user32下函數(shù)ShowWindow即可:
private const int SwHide = 0; //隱藏窗口 private const int SwRestore = 9;//還原窗口 /// <summary> /// 通過句柄,窗體顯示函數(shù) /// </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,與上面默認(rèn)任務(wù)欄操作所調(diào)用的ShowWindow不一樣,句柄參數(shù)是IntPtr
到此這篇關(guān)于C# 顯示、隱藏窗口對應(yīng)的任務(wù)欄的文章就介紹到這了,更多相關(guān)C# 顯示隱藏窗口任務(wù)欄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)一鍵換IP、重置DNS、網(wǎng)關(guān)及掩碼的方法
這篇文章主要介紹了C#實(shí)現(xiàn)一鍵換IP、重置DNS、網(wǎng)關(guān)及掩碼的方法,很實(shí)用的功能,需要的朋友可以參考下2014-07-07C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的方法詳解
這篇文章主要給大家介紹了關(guān)于C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法,涉及C#針對剪切板操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11Graphics.DrawImage繪制的圖像變大的原因分析及解決
這篇文章主要介紹了Graphics.DrawImage繪制的圖像變大的原因分析及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧分享
這篇文章主要為大家整理了一些優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧,文中的示例代碼講解詳細(xì),對我們深入了解C#有一定的幫助,需要的可以參考一下2023-06-06詳解C#如何對ListBox控件中的數(shù)據(jù)進(jìn)行操作
這篇文章主要為大家詳細(xì)介紹了C#中對ListBox控件中的數(shù)據(jù)進(jìn)行的操作,主要包括添加、刪除、清空、選擇、排序等,感興趣的小伙伴可以了解下2024-03-03