首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

让窗体显示在最前面但是又不要挡住任务栏如何实现

2012-01-16 
让窗体显示在最前面但是又不要挡住任务栏怎么实现如题:我用SetWindowPos方法会把任务栏挡住的。。[解决办法]

让窗体显示在最前面但是又不要挡住任务栏怎么实现
如题:
我用SetWindowPos   方法会把任务栏挡住的。。

[解决办法]
那就子类处理,限制窗口的移动范围
[解决办法]
你可以先让你的窗口置于最前端, 然后找到任务条的句柄, 并置于最前端...
[解决办法]
rainstormmaster(暴风雨 v2.0) ( ) 信誉:238 Blog 加为好友 2007-6-1 17:01:41 得分: 0



那就子类处理,限制窗口的移动范围



//



这样的话,窗体无论如何也无法拖动到任务条的坐标那里去,呵呵
[解决办法]
标准模块内:

Option Explicit

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVING = &H216

Public Declare Function SetWindowLong Lib "user32 " Alias "SetWindowLongA " (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32 " Alias "CallWindowProcA " (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32 " Alias "RtlMoveMemory " (Destination As Any, Source As Any, ByVal Length As Long)

Public PrevWndProc As Long
Public TaskBarHeight As Long

Public Function NewWndProc(ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case MSG
Case WM_MOVING '窗体移动事件
Dim RT As RECT

CopyMemory RT, ByVal lParam, Len(RT)
With RT
Debug.Print "Left= " & .Left & " / Top= " & .Top
If .Left <= 0 Then .Left = 0
If .Top <= 0 Then .Top = 0
If .Top > (Screen.Height - TaskBarHeight - frmMain.Height) / 15 Then .Top = (Screen.Height - TaskBarHeight - frmMain.Height) / 15
End With
CopyMemory ByVal lParam, RT, Len(RT)
End Select
NewWndProc = CallWindowProc(PrevWndProc, hwnd, MSG, wParam, lParam) '其它消息不管
End Function

在窗体LOAD事件里加入:

TaskBarHeight = GetTaskbarHeight
PrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf NewWndProc) '挂上子类过程

UNLOAD事件里加入:

SetWindowLong Me.hwnd, GWL_WNDPROC, PrevWndProc '取消子类过程

GetTaskbarHeight函数在另一模块模块内:

'*************************************************************************
'**模 块 名:ModGetTaskbar
'**说 明:返回任务栏的信息
'**创 建 人:13727859861
'**日 期:2007年1月3日
'**版 本:V1.0
'*************************************************************************
Option Explicit

Private Declare Function SystemParametersInfo Lib "user32 " Alias "SystemParametersInfoA " (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Declare Function FindWindow Lib "user32 " Alias "FindWindowA " (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const SPI_GETWORKAREA = 48

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Function GetTaskbarHwnd() As Long
GetTaskbarHwnd = FindWindow( "Shell_traywnd ", " ")


End Function

Public Function GetTaskbarHeight() As Integer
'返回系统任务栏高度,以缇(twips)做单位
Dim lRes As Long
Dim rectVal As RECT

lRes = SystemParametersInfo(SPI_GETWORKAREA, 0, rectVal, 0)
GetTaskbarHeight = ((Screen.Height / Screen.TwipsPerPixelX) - rectVal.Bottom) * Screen.TwipsPerPixelX
End Function

热点排行