Option ExplicitPrivate Type POINTAPI X As Long Y As Long End Type Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPrivate Sub Form_Load() Timer1.Interval = 500 Timer1.Enabled = True End SubPrivate Sub Form_Unload(Cancel As Integer) Timer1.Enabled = False End SubPrivate Sub Timer1_Timer() On Local Error Resume Next Static lX As Long, lY As Long Dim P As POINTAPI, h As Long, hD As Long, r As Long
'获取鼠标当前位置的坐标,以屏幕为坐标系 GetCursorPos P
'判断当前点是否刚取过 If P.X = lX And P.Y = lY Then Exit Sub lX = P.X: lY = P.Y '获取当前鼠标所在点所属窗口的句柄 h = WindowFromPoint(lX, lY)
If h <> Me.hwnd Then MsgBox "I was out!" End If End Sub
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPrivate Sub Form_Load()
Timer1.Interval = 500
Timer1.Enabled = True
End SubPrivate Sub Form_Unload(Cancel As Integer)
Timer1.Enabled = False
End SubPrivate Sub Timer1_Timer()
On Local Error Resume Next
Static lX As Long, lY As Long
Dim P As POINTAPI, h As Long, hD As Long, r As Long
'获取鼠标当前位置的坐标,以屏幕为坐标系
GetCursorPos P
'判断当前点是否刚取过
If P.X = lX And P.Y = lY Then Exit Sub
lX = P.X: lY = P.Y '获取当前鼠标所在点所属窗口的句柄
h = WindowFromPoint(lX, lY)
If h <> Me.hwnd Then
MsgBox "I was out!"
End If
End Sub
如果有其它控件,需要判断用WindowFromPoint(lX, lY)取得的句柄是否跟窗体的句柄和窗体上所有控件的句柄都不一样(有些控件是没有句柄的),如果都不一样,说明是在窗体外面。