日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 任务栏的相关信息

發布時間:2024/4/15 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;?????????????//?The?size?of?the?structure,?in?bytes.???
  • ????HWND?hWnd;????????????????//?The?handle?to?the?appbar?window.???
  • ????UINT?uCallbackMessage;????//?An?application-defined?message?identifier.This?member?is?used?when?sending?the?ABM_NEW?message.???
  • ????UINT?uEdge;???????????????//?邊界位置,有4種:ABE_BOTTOM、ABE_LEFT、ABE_RIGHT、ABE_TOP??
  • ????RECT?rc;??????????????????//?任務欄的邊界矩形位置。??
  • ????LPARAM?lParam;????????????//?This?member?is?used?with?the?ABM_SETAUTOHIDEBAR?and?ABM_SETSTATE?messages.???
  • }?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);???//?此處也可以使用ABM_GETAUTOHIDEBAR來獲取??
  • ????????if?(0?==?uState)??
  • ????????{??
  • ????????????//?0:?Taskbar?is?neither?in?the?auto-hide?nor?always-on-top?state.??
  • ????????????//?1:?ABS_AUTOHIDE?The?taskbar?is?in?the?auto-hide?state.???
  • ????????????//?2:?ABS_ALWAYSONTOP?The?taskbar?is?in?the?always-on-top?state.???
  • ????????}??
  • ????????...??
  • ????}??

  • 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??
  • ????????}??
  • ??
  • ????????///?<summary>??
  • ????????///?Retrieve?current?task?bar's?position?info.??
  • ????????///?</summary>??
  • ????????///?<param?name="taskbarRect">Current?task?bar's?rectangle.</param>??
  • ????????///?<param?name="eTaskbarEdge">Current?task?bar's?edge.</param>??
  • ????????///?<param?name="eTaskbarState">Current?task?bar's?state.</param>??
  • ????????public?void?GetTaskbarPosInfo(??
  • ????????????ref?Rectangle?taskbarRect,???
  • ????????????ref?Win32API.AppBarEdge?eTaskbarEdge,??
  • ????????????ref?Win32API.AppBarStates?eTaskbarState)??
  • ????????{??
  • ????????????eTaskbarState?=?Win32API.AppBarStates.AlwaysOnTop;??//?Init?default?state??
  • ??
  • ????????????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);??
  • ????????????}??
  • ????????}??
  • ??
  • ????????///?<summary>??
  • ????????///?Initialize?the?popup?window's?position.???
  • ????????///?</summary>??
  • ????????///?<returns></returns>??
  • ????????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);??
  • ??
  • ????????????//?Whether?current?UI?language?is?Middle?East?country?language.??
  • ????????????//?Because?the?Middle?East?country'?user?is?right?handed,?so?the?popup?window's?position???
  • ????????????//?is?different?with?normal?when?task?bar?is?in?TOP?and?BOTTOM?status.??
  • ????????????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)/*(1?==?rightHanded)???(nSceenHeight?-?this.Height)?:?(0)*/;??
  • ????????????????????break;??
  • ????????????????default:??
  • ????????????????????this.Left?=?!isMiddleEastLanguage???(taskbarRect.Right?-?this.Width)?:?taskbarRect.Left;??
  • ????????????????????this.Top?=?isTaskBarHide???(taskbarRect.Bottom?-?this.Height)?:?(taskbarRect.Top?-?this.Height);??
  • ????????????????????break;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????///?<summary>??
  • ????????///?Whether?the?current?UI?culture?is?middle?country?or?not.??
  • ????????///?</summary>??
  • ????????///?<returns>Return?true?or?false.</returns>??
  • ????????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# 任务栏的相关信息的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。