此代码由我编写,但基于我从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 或 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