无论是qq还是飞信,都有靠边隐藏的功能,现在我就来给大家说说靠边隐藏是如何实现的。
首先的知道3个ActiveX函数:
1、GetCursorPos函数:该函数检取光标的位置,以屏幕坐标表示。
2、GetWindowRect函数:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
参数:
参数
hWnd: 窗口句柄。hWndlnsertAfter:在z序中的位于被置位的窗口前的 窗口句柄。该参数必须为一个窗口句柄,或下列值之一:HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。HWND_TOP:将窗口置于Z序的顶部。HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。查看该参数的使用方法,请看说明部分。x:以客户坐标指定窗口新位置的左边界。Y:以客户坐标指定窗口新位置的顶边界。cx:以像素指定窗口的新的宽度。cy:以像素指定窗口的新的高度。uFlags:窗口尺寸和定位的标志。该参数可以是下列值的组合:SWP_ASYNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。SWP_DRAWFRAME:在窗口周围画一个边框(定义在 窗口类描述中)。SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。SWP_HIDEWINDOW;隐藏窗口。SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。SWP_NOMOVE:维持当前位置(忽略X和Y参数)。SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志, 应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。SWP_NOREPOSITION;与SWP_NOOWNERZORDER标志相同。SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。SWP_SHOWWINDOW:显示窗口。返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误消息,请调用GetLastError函数。
认识了这些函数的用途,和参数,就可以轻松使用了。
定义部分:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private 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
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
利用timer事件来分析是否隐藏
Private Sub Timer1_Timer()
Dim p As POINTAPI
Dim f As RECT
GetCursorPos p '得到MOUSE位置
GetWindowRect Me.hwnd, f '得到窗体的位置
If Me.WindowState <> 1 Then
If p.x > f.Left And p.x < f.Right And p.y > f.Top And p.y < f.Bottom Then
'MOUSE 在窗体上
If Me.Top < 0 Then
Me.Top = -10
Me.Show
ElseIf Me.Left < 0 Then
Me.Left = -10
Me.Show
ElseIf Me.Left + Me.Width >= Screen.Width Then
Me.Left = Screen.Width - Me.Width + 10
Me.Show
End If
Else
If f.Top <= 4 Then
Me.Top = 40 - Me.Height
ElseIf f.Left <= 4 Then
Me.Left = 40 - Me.Width
ElseIf Me.Left + Me.Width >= Screen.Width - 4 Then
Me.Left = Screen.Width - 40
End If
End If
End If
End Sub
这就是一个form窗体,将他放在你的软件中,就可以实现靠边隐藏的功能了。