C# 任务栏的相关信息

摘要:
Windows提供相关操作和API操作。ABM_ACTIVATE:通知系统任务栏已激活。ABM_GETAUTOHIDEBAR:查询任务栏是否自动隐藏。ABM_GETSTATE:查询任务栏是否自动隐藏,并且卡片是否始终处于顶层。ABM_GETTASKBARPOS:获取任务栏边框的位置。ABM_ NEW、ABM_ REMOVE、ABM_SETAUTOHIDEBAR、ABM_SETPOS、ABM _SETSTATE、ABM_LWINDOWPOSCHANGED[csharp]viewplaincopytypedefstruct_AppBarData{DWORDcbSize;//结构的大小,以字节为单位。HWNDhWnd;//appbarwindow的句柄。UINTuCallbackMessage。

问题提出:对于普通应用程序,我们很多时候会将窗口最小化到系统托盘。当我们点击这个托盘图标时,可能会弹出一些友好的提示界面,可以恰当的进行一些操作。
一般情况下,我们可能粗暴的将这个友好提示界面放置在桌面的右下角,对于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

  1. typedefstruct_AppBarData{
  2. DWORDcbSize;//Thesizeofthestructure,inbytes.
  3. HWNDhWnd;//Thehandletotheappbarwindow.
  4. UINTuCallbackMessage;//Anapplication-definedmessageidentifier.ThismemberisusedwhensendingtheABM_NEWmessage.
  5. UINTuEdge;//边界位置,有4种:ABE_BOTTOM、ABE_LEFT、ABE_RIGHT、ABE_TOP
  6. RECTrc;//任务栏的边界矩形位置。
  7. LPARAMlParam;//ThismemberisusedwiththeABM_SETAUTOHIDEBARandABM_SETSTATEmessages.
  8. }APPBARDATA,*PAPPBARDATA;

一个简单的C++代码:
  1. HWNDhwnd=FindWindow(L"Shell_TrayWnd",L"");
  2. if(hwnd!=NULL)
  3. {
  4. APPBARDATAabd={sizeof(APPBARDATA)};
  5. abd.hWnd=hwnd;
  6. BOOLbRt=SHAppBarMessage(ABM_GETTASKBARPOS,&abd);//此处能够获取位置和矩形
  7. UINTuState=(UINT)SHAppBarMessage(ABM_GETSTATE,&abd);//此处也可以使用ABM_GETAUTOHIDEBAR来获取
  8. if(0==uState)
  9. {
  10. //0:Taskbarisneitherintheauto-hidenoralways-on-topstate.
  11. //1:ABS_AUTOHIDEThetaskbarisintheauto-hidestate.
  12. //2:ABS_ALWAYSONTOPThetaskbarisinthealways-on-topstate.
  13. }
  14. ...
  15. }

C#代码:

功能:
1. 获取taskbar的位置
2. 计算出所放窗口的位置

  1. 首先需要引入API及相关宏和结构体:
  2. [DllImport("shell32.dll")]
  3. publicstaticexternIntPtrSHAppBarMessage(uintdwMessage,refAPPBARDATApData);
  4. publicenumAppBarMessages
  5. {
  6. New=0x00000000,
  7. Remove=0x00000001,
  8. QueryPos=0x00000002,
  9. SetPos=0x00000003,
  10. GetState=0x00000004,
  11. GetTaskBarPos=0x00000005,
  12. Activate=0x00000006,
  13. GetAutoHideBar=0x00000007,
  14. SetAutoHideBar=0x00000008,
  15. WindowPosChanged=0x00000009,
  16. SetState=0x0000000a
  17. }
  18. [StructLayout(LayoutKind.Sequential)]
  19. publicstructRECT
  20. {
  21. publicint_Left;
  22. publicint_Top;
  23. publicint_Right;
  24. publicint_Bottom;
  25. }
  26. [StructLayout(LayoutKind.Sequential)]
  27. publicstructAPPBARDATA
  28. {
  29. publicintcbSize;
  30. publicIntPtrhWnd;
  31. publicuintuCallbackMessage;
  32. publicuintuEdge;
  33. publicRECTrc;
  34. publicintlParam;
  35. }
  36. publicenumAppBarStates
  37. {
  38. AutoHide=0x00000001,
  39. AlwaysOnTop=0x00000002
  40. }
  41. publicenumAppBarEdge
  42. {
  43. ABE_LEFT=0,
  44. ABE_TOP=1,
  45. ABE_RIGHT=2,
  46. ABE_BOTTOM=3
  47. }
  48. ///<summary>
  49. ///Retrievecurrenttaskbar'spositioninfo.
  50. ///</summary>
  51. ///<paramname="taskbarRect">Currenttaskbar'srectangle.</param>
  52. ///<paramname="eTaskbarEdge">Currenttaskbar'sedge.</param>
  53. ///<paramname="eTaskbarState">Currenttaskbar'sstate.</param>
  54. publicvoidGetTaskbarPosInfo(
  55. refRectangletaskbarRect,
  56. refWin32API.AppBarEdgeeTaskbarEdge,
  57. refWin32API.AppBarStateseTaskbarState)
  58. {
  59. eTaskbarState=Win32API.AppBarStates.AlwaysOnTop;//Initdefaultstate
  60. IntPtrhTaskBarWnd=Win32API.FindWindow("Shell_TrayWnd","");
  61. if(hTaskBarWnd!=null)
  62. {
  63. Win32API.APPBARDATAabd=newWin32API.APPBARDATA();
  64. abd.cbSize=Marshal.SizeOf(typeof(Win32API.APPBARDATA));
  65. Win32API.SHAppBarMessage((uint)(Win32API.AppBarMessages.GetTaskBarPos),refabd);
  66. eTaskbarEdge=(Win32API.AppBarEdge)(abd.uEdge);
  67. IntPtrhTmpWnd=Win32API.SHAppBarMessage((uint)(Win32API.AppBarMessages.GetAutoHideBar),refabd);
  68. if(0!=hTmpWnd.ToInt64())
  69. {
  70. eTaskbarState=Win32API.AppBarStates.AutoHide;
  71. }
  72. taskbarRect=Rectangle.FromLTRB(abd.rc._Left,abd.rc._Top,abd.rc._Right,abd.rc._Bottom);
  73. }
  74. }
  75. ///<summary>
  76. ///Initializethepopupwindow'sposition.
  77. ///</summary>
  78. ///<returns></returns>
  79. privatevoidInitialPosition()
  80. {
  81. RectangletaskbarRect=newRectangle();
  82. Win32API.AppBarEdgeeTaskbarEdge=newWin32API.AppBarEdge();
  83. Win32API.AppBarStateseTaskbarState=newWin32API.AppBarStates();
  84. Win32API.GetTaskbarPosInfo(reftaskbarRect,refeTaskbarEdge,refeTaskbarState);
  85. intnSceenWidth=(int)Math.Ceiling(SystemParameters.VirtualScreenWidth);
  86. intnSceenHeight=(int)Math.Ceiling(SystemParameters.VirtualScreenHeight);
  87. //WhethercurrentUIlanguageisMiddleEastcountrylanguage.
  88. //BecausetheMiddleEastcountry'userisrighthanded,sothepopupwindow'sposition
  89. //isdifferentwithnormalwhentaskbarisinTOPandBOTTOMstatus.
  90. boolisMiddleEastLanguage=IsMiddleEastLanguage();
  91. boolisTaskBarHide=(Win32API.AppBarStates.AutoHide==eTaskbarState)?true:false;
  92. switch(eTaskbarEdge)
  93. {
  94. caseWin32API.AppBarEdge.ABE_LEFT:
  95. this.Left=isTaskBarHide?taskbarRect.Left:(taskbarRect.Right);
  96. this.Top=nSceenHeight-this.Height;
  97. break;
  98. caseWin32API.AppBarEdge.ABE_TOP:
  99. this.Left=!isMiddleEastLanguage?(taskbarRect.Right-this.Width):taskbarRect.Left;
  100. this.Top=isTaskBarHide?taskbarRect.Top:(taskbarRect.Bottom);
  101. break;
  102. caseWin32API.AppBarEdge.ABE_RIGHT:
  103. this.Left=isTaskBarHide?(taskbarRect.Right-this.Width):(taskbarRect.Left-this.Width);
  104. this.Top=(nSceenHeight-this.Height)/*(1==rightHanded)?(nSceenHeight-this.Height):(0)*/;
  105. break;
  106. default:
  107. this.Left=!isMiddleEastLanguage?(taskbarRect.Right-this.Width):taskbarRect.Left;
  108. this.Top=isTaskBarHide?(taskbarRect.Bottom-this.Height):(taskbarRect.Top-this.Height);
  109. break;
  110. }
  111. }
  112. ///<summary>
  113. ///WhetherthecurrentUIcultureismiddlecountryornot.
  114. ///</summary>
  115. ///<returns>Returntrueorfalse.</returns>
  116. privateboolIsMiddleEastLanguage()
  117. {
  118. stringcultureName=System.Globalization.CultureInfo.CurrentUICulture.Name;
  119. stringmainLanguage=cultureName.Substring(0,2);
  120. if(mainLanguage.Equals("ar")||mainLanguage.Equals("he"))
  121. {
  122. returntrue;
  123. }
  124. returnfalse;
  125. }

免责声明:文章转载自《C# 任务栏的相关信息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SaltStack--远程执行禁用/移除WordPress页面的评论功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Win10系统,怎样将文件夹固定到开始屏幕/任务栏?

转载自百度经验:Win10系统,怎样将文件夹固定到开始屏幕/任务栏-百度经验 (baidu.com) 当我们将软件快捷方式、文件夹、文件等一股脑放在电脑桌面上时,桌面就会变得凌乱而不美观,从而影响上网的心情和做事的效率,其实我们可以将常用的文件夹、软件等放到“开始”屏幕或任务栏上,这样既保证了打开的便捷性,又使电脑桌面变得干净美观。 工具/原料...

QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透窗口置顶qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)这样的置顶窗口不会处于全屏窗口的上方,如果需要真正的置顶,s...

如何美化windows桌面

如何美化windows桌面 一、总结 一句话总结: 主要使用如下5个软件:Porcelain 主题&图标;Fences整理桌面;WallpaperEngine动态壁纸;StartlsBack自定义菜单和任务栏;Rainmeter桌面控件; 二、如何美化windows桌面 桌面效果 1、资料 参考:https://www.zhihu.com/qu...

万能驱动助理篡改主页为2345的解决办法

万能驱动助理,因为驱动比较全,都是离线的包,并且足够小,所以很多人用,我也用,上次帮别人装系统之后用万能驱动助理安装驱动,然后发现默认安装了2345浏览器,然后我网上查了一下,原文如下: 感觉最新版的万能驱动助理在安装驱动的时候会自动安装2345浏览器。只需要找到这个文件[WinXP.x86]WanDrv6,Win7的是这个[Win7.x86]WanDrv...

MATLAB相关快捷键以及常用函数

MATLAB快捷键大全 F1帮助F2改名F3搜索 F4地址 F5刷新F6切换F10菜单CTRL+A全选CTRL+C复制CTRL+X剪切CTRL+V粘贴CTRL+Z撤消CTRL+O打开SHIFT+DELETE永久删除DELETE删除ALT+ENTER属性ALT+F4关闭CTRL+F4关闭ALT+TAB切换ALT+ESC切换ALT+空格键窗口菜单CTRL+ES...

任务栏-添加我的电脑

1. 新建一个快捷方式:在桌面右击->新建->快捷方式 2. 然后输入%SystemRoot%explorer.exe /E,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}点击下一步 3. 随意键入个名字如:我的电脑,点击完成 4. 桌面上已经有一个快捷方式了,不过图标并不是我们需要的,鼠标右...