在窗体上加一个计时器控件,然后: private sub Timer1_timer() if me.top<10 then me.top=-me.height+10 end subprivate sub mouse_move(....) if x<10 then me.top=100 end sub
Option Explicit 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 LongPrivate Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type POINTAPI X As Long Y As Long End TypePrivate Const HWND_TOPMOST = -1 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Const HWND_TOP = 0 Private Const SWP_NOACTIVATE = &H10 Private Const SWP_SHOWWINDOW = &H40 Private Sub Form_Load() SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE End SubPrivate Sub Timer1_Timer() Dim p As POINTAPI Dim f As RECT GetCursorPos p 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
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 IfEnd Sub
做了一个比较粗糙的实现方法,还需要继续改进。一个form 两个timerOption ExplicitDim State As Boolean '用来表示窗体目前是否隐藏 Dim Direct As IntegerPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Not State Then Timer1.Enabled = True Timer1.Interval = 1500 Direct = 1 Else Timer2.Enabled = True Direct = 2 End If DoEvents End SubPrivate Sub Timer1_Timer() If Not State Then If Me.Left < 0 Then Me.Height = Screen.Height Me.Width = 3000 Me.Top = 0 Me.Left = 0 Timer1.Enabled = False
Timer2.Interval = 10 Timer2.Enabled = True ElseIf Me.Top < 0 Then '向上 ElseIf Me.Left > Screen.Width - Me.Width Then '向右 End If Else Direct = 1 Timer2.Interval = 10 Timer2.Enabled = True End If End SubPrivate Sub Timer2_Timer() If Direct = 1 Then Me.Left = Me.Left - 50 Else If Me.Left = 0 Then Exit Sub Me.Left = Me.Left + 50 End If If Me.Left < 150 - Me.Width Then Timer2.Enabled = False Me.Left = 150 - Me.Width State = True Timer1.Enabled = True End If If Me.Left > 0 Then Timer2.Enabled = False Me.Left = 0 State = True Timer1.Enabled = True End If End Sub
private sub Timer1_timer()
if me.top<10 then me.top=-me.height+10
end subprivate sub mouse_move(....)
if x<10 then me.top=100
end sub
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 LongPrivate Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
X As Long
Y As Long
End TypePrivate Const HWND_TOPMOST = -1
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_TOP = 0
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_SHOWWINDOW = &H40
Private Sub Form_Load()
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End SubPrivate Sub Timer1_Timer()
Dim p As POINTAPI
Dim f As RECT
GetCursorPos p
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
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 IfEnd Sub
Dim Direct As IntegerPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Not State Then
Timer1.Enabled = True
Timer1.Interval = 1500
Direct = 1
Else
Timer2.Enabled = True
Direct = 2
End If
DoEvents
End SubPrivate Sub Timer1_Timer()
If Not State Then
If Me.Left < 0 Then
Me.Height = Screen.Height
Me.Width = 3000
Me.Top = 0
Me.Left = 0
Timer1.Enabled = False
Timer2.Interval = 10
Timer2.Enabled = True
ElseIf Me.Top < 0 Then
'向上
ElseIf Me.Left > Screen.Width - Me.Width Then
'向右
End If
Else
Direct = 1
Timer2.Interval = 10
Timer2.Enabled = True
End If
End SubPrivate Sub Timer2_Timer()
If Direct = 1 Then
Me.Left = Me.Left - 50
Else
If Me.Left = 0 Then Exit Sub Me.Left = Me.Left + 50
End If
If Me.Left < 150 - Me.Width Then
Timer2.Enabled = False
Me.Left = 150 - Me.Width
State = True
Timer1.Enabled = True
End If
If Me.Left > 0 Then
Timer2.Enabled = False
Me.Left = 0
State = True
Timer1.Enabled = True
End If
End Sub