如何在程序初始化的时候设置 WINDOWS任务栏自动隐藏?就象在任务栏那点鼠标右键,然后在“总在最前” 和“自动隐藏”两项目都打上勾的效果?我要的不是下面这段代码达到的效果,它只是将栏目完全不可显示,但它实际还是占在原来的位置,程序还是无法全屏显示,而且鼠标放到任务栏处任务栏也不显示,非常不友好,有哪位老大知道,谢谢啦---------------------------------------------------------------------
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const SW_SHOW = 5
Public Const SW_HIDE = 0
Private hwnd5 as Longhwnd5 = FindWindow("Shell_traywnd","")
Call ShowWindow(hwnd5, SW_HIDE) '隐藏任务栏
Call ShowWindow(hwnd5, SW_SHOW) '显示任务栏
---------------------------------------------------------------------
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const SW_SHOW = 5
Public Const SW_HIDE = 0
Private hwnd5 as Longhwnd5 = FindWindow("Shell_traywnd","")
Call ShowWindow(hwnd5, SW_HIDE) '隐藏任务栏
Call ShowWindow(hwnd5, SW_SHOW) '显示任务栏
---------------------------------------------------------------------
解决方案 »
- 使用Process32Next逐个获取当前系统的所有进程名并保存到数组中时该怎样定义这个数组上下标呢?
- 使用excel 的find函数报错
- 报表问题
- 怎样对ListView控件模式为VReport中的数字进行排序啊?
- 查找指定窗体(知道Caption的前几个字符)返回窗体句柄用哪(几)个API?
- 为什么我打开文件,准备写入东西的时候,它总是出现错误:错误的文件名或文件号??
- 请教如何用VB6。0来读写图形字段?
- 我定义的数组i=0,为什么还显示下标越界????请高手指点
- 请问:datagride 与adodc绑定;当adodc所连接的表改变后,为何datagrid的内容不变
- 再请高手指点,十万火急
- 请问高手如何用 SOAP VB Client 访问期问 Web Server
- 水晶报表打包出错!!~~~~求救
摘要:WIN95的任务栏具有自动隐藏功能,当用户的鼠标移到屏幕的最下面时,它自动出现,用户将鼠标移走后它自动隐藏,减少了屏幕空间的占用,东方快车等软件也采用了这种功能。这个功能看起来很神秘,其实要实现这个功能并不太复杂,我们完全可以在自己的程序加入这个功能,本文举例说明如何在VB中实现这个功能。
正文:
大家对WIN95任务栏的自动隐藏功能都比较熟悉,当用户的鼠标移到屏幕的最下面时,它自动出现,用户将鼠标移走后它自动隐藏,减少了屏幕空间的占用,东方快车等软件也采用了这种功能。这个功能看起来很神秘,其实要实现这个功能并不太复杂,我们完全可以在自己的程序加入这个功能,下面说明如何在VB中实现这个功能。
实现这个功能的思路如下:用一个窗体作为任务栏,利用WINDOWS的API函数SHAppBarMessage发送消息来控制任务栏,用户可利用此函数将任务栏随意放置在屏幕上下左右四个边的其中一个边上。首先将任务栏移到屏幕的顶端(这里将任务栏放置在屏幕的最顶部,其他边一样)之外,使任务栏的下边界和屏幕的最顶部重合(这样才能到接收鼠标信息),当用户将鼠标移到屏幕最顶部时,利用MouseMove事件获得鼠标移动到任务栏的信息后,将任务栏下移出来,这就是自动弹出,使其
上边界与屏幕顶部重合。在这里需要一个定时器控件,用它来随时检测鼠标是否已离开任务栏,如果鼠标已离开则将任务栏移走,这就是隐藏。实现这个功能还需要一些API函数,如设定工具栏为矩形的SetRect,获取屏幕设定的GetSystemMetrics,设定窗口位置的SetWindowPos,获得光标位置的GetCursorPos函数等,这些API函数都可以从API帮助文件中直接复制得到。
下面举例说明实现方法。
本例设计任务栏的隐藏和出现采用滑动的方法,这也是目前的一些软件常用的技巧,如OFFICE中可以使菜单滑动下拉。在窗体中添加一个定时器 tmrHide,一个命令按钮Command1。添加一新模块用来声明所用的API函数及它们用到类型及常数(这些可从API说明文件中复制):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本程序在中文WIN95、VB5.0中文专业版下调试通过。
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As LongConst SW_HIDE = 0
Const SW_SHOWNORMAL = 1
Private hwnd5 as Longhwnd5 = FindWindow("Shell_traywnd","")
Call ShowWindow(hwnd5, SW_HIDE) '隐藏任务栏
Call ShowWindow(hwnd5, SW_SHOWNORMAL) '显示任务栏改成这样试试
Public Const SW_HIDE = 0 ' Hide Window
Public Const SW_SHOW = 5 ' Show Window
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPublic Sub DisplayTaskBar(ByVal bShow As Boolean)
Dim lTaskBarHWND As Long
Dim lRet As Long
Dim lFlags As Long
On Error GoTo vbErrorHandler
lFlags = IIf(bShow, SW_SHOW, SW_HIDE)
lTaskBarHWND = FindWindow("Shell_TrayWnd", "")
lRet = ShowWindow(lTaskBarHWND, lFlags)
If lRet < 0 Then
End If
Exit Sub
vbErrorHandler:
Exit Sub
End SubPublic Sub DisplayDeskTopIcons(ByVal bShow As Boolean)
Dim lDesktopHwnd As Long
Dim lFlags As Long
On Error Resume Next
lDesktopHwnd = FindWindowEx(0&, 0&, "Progman", vbNullString)
If lDesktopHwnd = 0 Then
Exit Sub
End If
lFlags = IIf(bShow, SW_SHOW, SW_HIDE)
ShowWindow lDesktopHwnd, lFlags
End Sub
然后在里面执行你的初始化操作。
需要窗体的时候你写一个 sub main
load 你的窗体
你的窗体.hide
end sub
当你需要显示的时候执行你的窗体.show另外注意的是:如果你在窗体没有show出来之前,引用了窗体上的某个控件,窗体会自动的show。