生活随笔
收集整理的這篇文章主要介紹了
C# 任务栏的相关信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
問題提出:對于普通應用程序,我們很多時候會將窗口最小化到系統托盤。當我們點擊這個托盤圖標時,可能會彈出一些友好的提示界面,可以恰當的進行一些操作。
一般情況下,我們可能粗暴的將這個友好提示界面放置在桌面的右下角,對于XP,這是OK的,因為XP不允許我們將任務欄拖動到桌面的上、左、右三個方向,
只允許停靠下桌面的最下方,但是對于win7,我們便需要考慮到其它三個方向,再根據這個方向確定好提示界面放的位置。那么,如何獲得任務欄的位置及相關信息?
windows提供了相關和API進行操作。
UINT_PTR SHAppBarMessage(
DWORD dwMessage,
PAPPBARDATA pData
);
其中
dwMessage為發送給system的消息。
pData為一個APPBARDATA結構體,用于存儲發送或者返回的數據。
dwMessage只能為以下的其中一個值。
ABM_ACTIVATE:告知系統任務欄被激活。
ABM_GETAUTOHIDEBAR:查詢任務欄是否是自動隱藏(前提是要給出任務欄停靠的位置)。
ABM_GETSTATE:查詢任務欄自動隱藏和總是牌處于頂層的狀態。
ABM_GETTASKBARPOS:獲取任務欄的邊界矩形位置。
ABM_QUERYPOS:請求任務欄的位置。(上、下、左、右)
其它狀態略。
ABM_NEW、ABM_REMOVE、ABM_SETAUTOHIDEBAR、ABM_SETPOS、ABM_SETSTATE、ABM_WINDOWPOSCHANGED
?
[csharp]?view plaincopy
typedef?struct?_AppBarData?{??????DWORD?cbSize;???????????????????HWND?hWnd;??????????????????????UINT?uCallbackMessage;??????????UINT?uEdge;?????????????????????RECT?rc;????????????????????????LPARAM?lParam;??????????????}?APPBARDATA,?*PAPPBARDATA;?? 一個簡單的C++代碼:
?
?
[csharp]?view plaincopy
HWND?hwnd?=?FindWindow(L"Shell_TrayWnd",?L"");??????if?(hwnd?!=?NULL)??????{??????????APPBARDATA?abd?=?{?sizeof(APPBARDATA)?};??????????abd.hWnd?=?hwnd;??????????BOOL?bRt?=?SHAppBarMessage(ABM_GETTASKBARPOS,?&abd);??????????????UINT?uState?=?(UINT)?SHAppBarMessage(ABM_GETSTATE,?&abd);?????????????if?(0?==?uState)??????????{????????????????????????????????????????????????????}??????????...??????}?? C#代碼:
?
功能:
1. 獲取taskbar的位置
2. 計算出所放窗口的位置
[csharp]?view plaincopy
首先需要引入API及相關宏和結構體:??????????[DllImport("shell32.dll")]??????????public?static?extern?IntPtr?SHAppBarMessage(uint?dwMessage,?ref?APPBARDATA?pData);????????????public?enum?AppBarMessages??????????{??????????????New??????????????=?0x00000000,??????????????Remove???????????=?0x00000001,??????????????QueryPos?????????=?0x00000002,??????????????SetPos???????????=?0x00000003,??????????????GetState?????????=?0x00000004,??????????????GetTaskBarPos????=?0x00000005,??????????????Activate?????????=?0x00000006,??????????????GetAutoHideBar???=?0x00000007,??????????????SetAutoHideBar???=?0x00000008,??????????????WindowPosChanged?=?0x00000009,??????????????SetState?????????=?0x0000000a??????????}????????????[StructLayout(LayoutKind.Sequential)]??????????public?struct?RECT??????????{??????????????public?int?_Left;??????????????public?int?_Top;??????????????public?int?_Right;??????????????public?int?_Bottom;??????????}????????????[StructLayout(LayoutKind.Sequential)]??????????public?struct?APPBARDATA??????????{??????????????public?int????cbSize;??????????????public?IntPtr?hWnd;??????????????public?uint???uCallbackMessage;??????????????public?uint???uEdge;??????????????public?RECT???rc;??????????????public?int????lParam;??????????}????????????public?enum?AppBarStates??????????{??????????????AutoHide????=?0x00000001,??????????????AlwaysOnTop?=?0x00000002??????????}????????????public?enum?AppBarEdge??????????{??????????????ABE_LEFT????=?0,??????????????ABE_TOP?????=?1,??????????????ABE_RIGHT???=?2,??????????????ABE_BOTTOM??=?3??????????}????????????????????????????????????????????????????????????????????????public?void?GetTaskbarPosInfo(??????????????ref?Rectangle?taskbarRect,???????????????ref?Win32API.AppBarEdge?eTaskbarEdge,??????????????ref?Win32API.AppBarStates?eTaskbarState)??????????{??????????????eTaskbarState?=?Win32API.AppBarStates.AlwaysOnTop;??????????????????IntPtr?hTaskBarWnd?=?Win32API.FindWindow("Shell_TrayWnd",?"");??????????????if?(hTaskBarWnd?!=?null)??????????????{??????????????????Win32API.APPBARDATA?abd?=?new?Win32API.APPBARDATA();??????????????????abd.cbSize?=?Marshal.SizeOf(typeof(Win32API.APPBARDATA));??????????????????Win32API.SHAppBarMessage((uint)(Win32API.AppBarMessages.GetTaskBarPos),?ref?abd);??????????????????eTaskbarEdge?=?(Win32API.AppBarEdge)(abd.uEdge);????????????????????IntPtr?hTmpWnd?=?Win32API.SHAppBarMessage((uint)(Win32API.AppBarMessages.GetAutoHideBar),?ref?abd);??????????????????if?(0?!=?hTmpWnd.ToInt64())??????????????????{??????????????????????eTaskbarState?=?Win32API.AppBarStates.AutoHide;??????????????????}????????????????????taskbarRect?=?Rectangle.FromLTRB(abd.rc._Left,?abd.rc._Top,?abd.rc._Right,?abd.rc._Bottom);??????????????}??????????}????????????????????????????????????????????????????private?void?InitialPosition()??????????{??????????????Rectangle?taskbarRect?=?new?Rectangle();??????????????Win32API.AppBarEdge?eTaskbarEdge?=?new?Win32API.AppBarEdge();??????????????Win32API.AppBarStates?eTaskbarState?=?new?Win32API.AppBarStates();??????????????Win32API.GetTaskbarPosInfo(ref?taskbarRect,?ref?eTaskbarEdge,?ref?eTaskbarState);????????????????int?nSceenWidth?=?(int)Math.Ceiling(SystemParameters.VirtualScreenWidth);??????????????int?nSceenHeight?=?(int)Math.Ceiling(SystemParameters.VirtualScreenHeight);??????????????????????????????????????????????????????????bool?isMiddleEastLanguage?=?IsMiddleEastLanguage();??????????????bool?isTaskBarHide?=?(Win32API.AppBarStates.AutoHide?==?eTaskbarState)???true?:?false;????????????????switch?(eTaskbarEdge)??????????????{??????????????????case?Win32API.AppBarEdge.ABE_LEFT:??????????????????????this.Left?=?isTaskBarHide???taskbarRect.Left?:?(taskbarRect.Right);??????????????????????this.Top?=?nSceenHeight?-?this.Height;??????????????????????break;??????????????????case?Win32API.AppBarEdge.ABE_TOP:??????????????????????this.Left?=?!isMiddleEastLanguage???(taskbarRect.Right?-?this.Width)?:?taskbarRect.Left;??????????????????????this.Top?=?isTaskBarHide???taskbarRect.Top?:?(taskbarRect.Bottom);??????????????????????break;??????????????????case?Win32API.AppBarEdge.ABE_RIGHT:??????????????????????this.Left?=?isTaskBarHide???(taskbarRect.Right?-?this.Width)?:?(taskbarRect.Left?-?this.Width);??????????????????????this.Top?=?(nSceenHeight?-?this.Height);??????????????????????break;??????????????????default:??????????????????????this.Left?=?!isMiddleEastLanguage???(taskbarRect.Right?-?this.Width)?:?taskbarRect.Left;??????????????????????this.Top?=?isTaskBarHide???(taskbarRect.Bottom?-?this.Height)?:?(taskbarRect.Top?-?this.Height);??????????????????????break;??????????????}??????????}????????????????????????????????????????????????????private?bool?IsMiddleEastLanguage()??????????{??????????????string?cultureName?=?System.Globalization.CultureInfo.CurrentUICulture.Name;??????????????string?mainLanguage?=?cultureName.Substring(0,?2);??????????????if?(mainLanguage.Equals("ar")?||?mainLanguage.Equals("he"))??????????????{??????????????????return?true;??????????????}??????????????return?false;??????????}?? ?
?
?
?
轉載于:https://www.cnblogs.com/qingtianhua/p/3480816.html
總結
以上是生活随笔為你收集整理的C# 任务栏的相关信息的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。