注意 WindowFromPoint 取不到窗口状态为 Enabled 的句柄Option Explicit 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 Type POINTAPI x As Long y As Long End TypePrivate Sub Timer1_Timer() Dim lpPoint As POINTAPI Dim hWnd As Long Timer1.Interval = 1000 GetCursorPos lpPoint hWnd = WindowFromPoint(lpPoint.x, lpPoint.y) End Sub
注意 WindowFromPoint 取不到窗口状态为 Enabled 的句柄Option Explicit
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 Type POINTAPI
x As Long
y As Long
End TypePrivate Sub Timer1_Timer()
Dim lpPoint As POINTAPI
Dim hWnd As Long
Timer1.Interval = 1000
GetCursorPos lpPoint
hWnd = WindowFromPoint(lpPoint.x, lpPoint.y)
End Sub
当它的Enabled=False的时候,虽然不可用,但你仍然可以对该句柄进行操作。
Public Declare Function ChildWindowFromPointEx Lib "user32" Alias "ChildWindowFromPointEx" (ByVal hWnd As Long, ByVal pt As POINTAPI, ByVal un As Long) As Long
【说明】
返回父窗口中包含了指定点的第一个子窗口的句柄
【返回值】
Long,发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零
【参数表】
hWnd ----------- Long,父窗口的句柄
xPoint
Long,点的X坐标,以像素为单位
yPoint
Long,点的Y坐标,以像素为单位 pt ------------- POINTAPI,点的坐标,以像素为单位 un ------------- Long,(只适用于ChildWindowFromPointEx)控制对窗口的搜索。参见下表
CWP_ALL
测试所有窗口
CWP_SKIPINVISIBLE
忽略不可见窗口
CWP_SKIPDISABLED
忽略已屏蔽的窗口
CWP_SKIPTRANSPARENT
忽略透明窗口
思路:1、先获得主窗体hwnd
2、用GetWindowRect获得左上角坐标
3、用ChildWindowFromPointEx 获得句柄
#define CWP_SKIPINVISIBLE 0x0001
#define CWP_SKIPDISABLED 0x0002
#define CWP_SKIPTRANSPARENT 0x0004