以编程方式获取Windows任务栏信息:自动隐藏状态,任务栏坐标,它所在的屏幕边缘和任务栏厚度

时间:2017-06-25 12:09:37

标签: vb.net pinvoke taskbar

我花了一段时间才找到这个答案,所以我想我会在这里分享它作为Q& A.

我希望我的Visual Basic程序程序能够检索以下信息:

  1. 任务栏的顶部,底部,左侧和右侧边缘的位置。底部 和Top表示这些边和顶部上任意点的y值 left表示这些边上任意点的x值。
  2. 它所在的屏幕边缘:底部,顶部,左侧或右侧屏幕 边缘
  3. Windows任务栏的自动隐藏状态
  4. 任务栏的厚度(请记住,厚度将根据DPI和屏幕边缘位置而变化,其中左右边缘可能会导致比顶部和底部更厚的任务栏。)

1 个答案:

答案 0 :(得分: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:下面的Sub可用于查找任务栏的顶部,底部,左侧和右侧边缘以及它所在的屏幕边缘的位置。

    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部分:下面的函数将为您提供自动隐藏状态的整数值。

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