'任务栏编程
MODULE1.BASOption ExplicitType POINTAPI
x As Long
y As Long
End TypeType RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypeType APPBARDATA
cbSize As Long
hwnd As Long
uCallbackMessage As Long
uEdge As Long
rc As RECT
lParam As Long 
End Type
Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage _
As Long, pData As APPBARDATA) As Long
Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, _ 
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) _ 
As Long
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _ 
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPublic Const WM_MOUSEMOVE = &H200
Public Const WM_ACTIVATE = &H6
Public Const WM_WINDOWPOSCHANGED = &H47Public Const ABE_TOP = 1
Public Const ABM_ACTIVATE = &H6
Public Const ABM_NEW = &H0
Public Const ABM_QUERYPOS = &H2
Public Const ABM_REMOVE = &H1
Public Const ABM_SETAUTOHIDEBAR = &H8
Public Const ABM_SETPOS = &H3
Public Const ABM_WINDOWPOSCHANGED = &H9
Public Const ABN_FULLSCREENAPP = &H2
Public Const ABN_POSCHANGED = &H1
Public Const ABN_STATECHANGE = &H0
Public Const ABN_WINDOWARRANGE = &H3Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1Public Const HWND_TOP = 0
Public Const HWND_TOPMOST = -1Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40将下面代码放到窗体的声明部分:
Option ExplicitDim BarData As APPBARDATA
Dim bAutoHide As Boolean
Dim bAnimate As Boolean
'单击任务栏上的命令按钮退出
'注意这里不要简单地用UNLOAD语句结束程序,必须首先将任务栏移走,否则桌面将不能
'恢复原状
Private Sub Command1_Click()
If BarData.hwnd <> 0 Then SHAppBarMessage ABM_REMOVE, BarData
Unload Me
End Sub'窗体的初始化,设置任务栏
Private Sub Form_Load()
Dim lResult As Long
Move 0, 0, Width, Height
Screen.MousePointer = vbDefault
bAutoHide = True
bAnimate = TrueBarData.cbSize = Len(BarData)
BarData.hwnd = hwnd
BarData.uCallbackMessage = WM_MOUSEMOVE
lResult = SHAppBarMessage(ABM_NEW, BarData)
lResult = SetRect(BarData.rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), _
GetSystemMetrics(SM_CYSCREEN))
BarData.uEdge = ABE_TOP
lResult = SHAppBarMessage(ABM_QUERYPOS, BarData)
If bAutoHide Then
BarData.rc.Bottom = BarData.rc.Top + 2 
lResult = SHAppBarMessage(ABM_SETPOS, BarData)
BarData.lParam = True
lResult = SHAppBarMessage(ABM_SETAUTOHIDEBAR, BarData)
If lResult = 0 Then
bAutoHide = False
Else
lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, _ 
BarData.rc.Top - 42, BarData.rc.Right - BarData.rc.Left, 44, _ 
SWP_NOACTIVATE)
End If
End If
If Not bAutoHide Then
BarData.rc.Bottom = BarData.rc.Top + 42
lResult = SHAppBarMessage(ABM_SETPOS, BarData)
lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, _ 
BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE)
End If
End Sub'窗体的鼠标移动事件
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)Static bRecieved As Boolean
Dim lResult As Long
Dim newRC As RECT
Dim lMessage As Long
lMessage = x / Screen.TwipsPerPixelX
If bRecieved = False Then
bRecieved = True
Select Case lMessage
Case WM_ACTIVATE
lResult = SHAppBarMessage(ABM_ACTIVATE, BarData)
Case WM_WINDOWPOSCHANGED
lResult = SHAppBarMessage(ABM_WINDOWPOSCHANGED, BarData)
Case ABN_STATECHANGE
lResult = SetRect(BarData.rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN))
BarData.uEdge = ABE_TOP
lResult = SHAppBarMessage(ABM_QUERYPOS, BarData)
If bAutoHide Then
BarData.rc.Bottom = BarData.rc.Top + 2
lResult = SHAppBarMessage(ABM_SETPOS, BarData)
BarData.lParam = True
lResult = SHAppBarMessage(ABM_SETAUTOHIDEBAR, BarData)
If lResult = 0 Then
bAutoHide = False
Else
lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top - 42, BarData.rc.Right - BarData.rc.Left, 44, SWP_NOACTIVATE)
End If
End If
If Not bAutoHide Then
BarData.rc.Bottom = BarData.rc.Top + 42
lResult = SHAppBarMessage(ABM_SETPOS, BarData)
lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE)
End If
Case ABN_FULLSCREENAPP
Beep
End Select
bRecieved = False
End IfDim iCounter As Integer
'如果顶部位置在屏幕外(负值),说明任务栏还处于隐藏状态,将其拉下来
If Top < 0 Then
If bAnimate Then
For iCounter = -26 To -1
BarData.rc.Top = iCounter
lResult = SetWindowPos(BarData.hwnd, 0&, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 24, SWP_NOACTIVATE)
Next
End If
BarData.rc.Top = 0
lResult = SetWindowPos(BarData.hwnd, HWND_TOPMOST, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 24, SWP_SHOWWINDOW)
tmrHide.Enabled = True
End If
End Sub
'定时器代码
Private Sub tmrHide_Timer()
Dim lResult As Long
Dim lpPoint As POINTAPI
Dim iCounter As Integer
'获取当前鼠标位置,如果移出了任务栏外则隐藏任务栏
lResult = GetCursorPos(lpPoint)
If lpPoint.x < Left \ Screen.TwipsPerPixelX Or lpPoint.x > (Left + Width) \ Screen.TwipsPerPixelX Or lpPoint.y < Top \ Screen.TwipsPerPixelY Or lpPoint.y - 10 > (Top + Height) \ Screen.TwipsPerPixelY Then
If bAnimate Then
For iCounter = -1 To -27 Step -1
BarData.rc.Top = iCounter
lResult = SetWindowPos(BarData.hwnd, 0&, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 24, SWP_NOACTIVATE)
Next
End If
BarData.rc.Top = -24
lResult = SetWindowPos(BarData.hwnd, HWND_TOPMOST, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 26, SWP_NOACTIVATE)
tmrHide.Enabled = False
End If
End Sub

解决方案 »

  1.   

    Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypePrivate Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As LongPrivate Sub Command1_Click()
        Dim lngHandle As Long
        Dim rctW As RECT
        Dim lngResult As Long
        
        lngHandle = FindWindow("Shell_TrayWnd", vbNullString)
        lngResult = GetWindowRect(lngHandle, rctW)
        If lngResult > 0 Then
            MsgBox rctW.Bottom - rctW.Top, vbInformation
        End If
    End Sub
      

  2.   

    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function FindWindow Lib "user32" lias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Sub Command1_Click()
        Dim trayh As Long,ret as long 
        Dim rc As RECT
       
        trayh = FindWindow("Shell_TrayWnd", vbNullString)
        GetWindowRect trayh, rc
        with rc
           print "高度:" & (.bottom-.top)
           print "宽度:" & (.right-.left)
        end with
        ret=IsWindowVisible(trayh) 
        print iif(ret=0,"不可见","可见")
    End Sub