2017-06-25 47 views
1

我花了一段时间来找到这个答案,所以我想我会在这里分享它为Q & A.编程方式获得Windows任务栏上的信息:自动隐藏状态,任务栏坐标,屏幕边缘是上和任务栏厚度

我想要一种方式让我的Visual Basic程序程序检索以下信息:

  1. 任务栏的顶部,底部,左侧和右侧边缘的位置。底部 和顶部表示这些边缘上的任意点的y值,顶部表示这些边缘上的任意点的x值。
  2. 在其上驻留的屏幕边缘:底部,顶部,左或右屏幕 边缘
  3. 视窗
  4. 自动隐藏状态的任务栏
  5. 任务栏(记住,厚度的
  6. 厚度会根据DPI和屏幕边缘位置左和右边缘可能会导致比顶部和底部更厚的任务栏)。

回答

1

此代码是由我写的,但基于我从this post on CodeGuru闪烁的信息。我要感谢Visual Vincent,它在评论部分提出了更正,使得可以在x64中运行此代码。

制备:共享的常量,变量和函数:

Const ABS_AUTOHIDE As Int32 = 1 
Const ABS_ONTOP As Int32 = 2 
Const ABM_NEW As Int32 = 0 
Const ABM_REMOVE As Int32 = 1 
Const ABM_QUERYPOS As Int32 = 2 
Const ABM_SETPOS As Int32 = 3 
Const ABM_GETSTATE As Int32 = 4 
Const ABM_GETTASKBARPOS As Int32 = 5 
Const ABM_ACTIVATE As Int32 = 6 
Const ABM_GETAUTOHIDEBAR As Int32 = 7 
Const ABM_SETAUTOHIDEBAR As Int32 = 8 
Const ABM_WINDOWPOSCHANGED As Int32 = 9 

Const TB_POS_BOTTOM As Integer = 1 
Const TB_POS_TOP As Integer = 2 
Const TB_POS_LEFT As Integer = 3 
Const TB_POS_RIGHT As Integer = 4 

Private Declare Function apiSHAppBarMessage Lib "shell32" Alias "SHAppBarMessage" (ByVal dwMessage As UInt32, ByRef pData As APPBARDATA) As UIntPtr 

Private Structure RECT 
    Public rLeft, rTop, rRight, rBottom As Int32 
End Structure 

Private Structure APPBARDATA 
    Public cbSize As UInt32, hwnd As IntPtr, uCallbackMessage, uEdge As UInt32, rc As RECT, lParam As IntPtr 
End Structure 

Dim ABD As New APPBARDATA 
Dim Autohide_State As Int32 
Dim taskbar_left, taskbar_right, taskbar_top, taskbar_bottom, taskbar_edge, taskbar_thickness As Integer  

第1部分& 2:下面的子可用于在任务栏的顶部,底部,左,右边缘的位置与屏幕边缘它驻留在哪里。

Private Sub GetTaskBarEdge_and_Coordinates() 
    apiSHAppBarMessage(ABM_GETTASKBARPOS, ABD) 
    taskbar_left = ABD.rc.rLeft 
    taskbar_right = ABD.rc.rRight 
    taskbar_top = ABD.rc.rTop 
    taskbar_bottom = ABD.rc.rBottom 

    'Figure out if it's located on the buttom, top, left or right edge of screen 
    If (taskbar_left < 5) And (taskbar_top > 5) Then 
     taskbar_edge = TB_POS_BOTTOM 
    ElseIf (taskbar_left < 5) And (taskbar_top < 5) And (taskbar_right > taskbar_bottom) Then 
     taskbar_edge = TB_POS_TOP 
    ElseIf (taskbar_left < 5) And (taskbar_top < 5) And (taskbar_right < taskbar_bottom) Then 
     taskbar_edge = TB_POS_LEFT 
    ElseIf (taskbar_left > 5) And (taskbar_top < 5) Then 
     taskbar_edge = TB_POS_RIGHT 
    Else 
     MsgBox("Something went wrong while I was trying to find the taskbar edge. Please contact the develloper. Defaulting Edge to bottom.") 
     taskbar_edge = TB_POS_BOTTOM 
    End If 
End Sub 

第3部分:下面的函数将为您获取Autohidden状态的整数值。

0 Means AH is off, Always on top is off. 
1 means AH is on and Always on Top is off. 
2 means AH is off and AoT is on. 
3 means AH and AoT are on. 

注常数我安装在第1部分:ABS_AUTOHIDE = 1,ABS_ONTOP = 2

Private Function GetTaskBarAHState() As Integer 
    Return CInt(apiSHAppBarMessage(ABM_GETSTATE, Nothing)) 
End Function 

4部分:任务栏厚度可以从taskbar_bottom计算 - taskbar_top OR taskbar_right - taskbar_left(取决于任务栏的边缘)。

Private Sub GetTaskBar_Thickness() 

    GetTaskBarEdge_and_Coordinates() 

    Select Case taskbar_edge 
     Case TB_POS_BOTTOM 
      taskbar_thickness = Math.Abs(taskbar_bottom - taskbar_top) 
     Case TB_POS_TOP 
      taskbar_thickness = Math.Abs(taskbar_bottom - taskbar_top) 
     Case Case TB_POS_LEFT 
      taskbar_thickness = Math.Abs(taskbar_right - taskbar_left) 
     Case TB_POS_RIGHT 
      taskbar_thickness = Math.Abs(taskbar_right - taskbar_left) 
     Case Else 
      MsgBox("Something went wrong while I tried to find Taskbar thickness. Please contact the develloper. Default to taskbar thickness of 39 [4]") 
      taskbar_thickness = 39 
    End Select 

End Sub  
+2

不错,但'APPBARDATA'结构中的字段不是正确的类型。 cbSize应该是UInt32,hWnd应该是IntPtr,uCallbackMessage,uEdge应该是UInt32,lParam应该是IntPtr。 –

+2

此外,'apiSHAppBarMessage'函数中的'dwMessage'参数应该是'UInt32',并且函数的返回值应该是'UIntPtr'。 –

+0

感谢文森特,我将再次阅读并应用您所建议的更改。 – thebunnyrules