请问如何通过屏幕鼠标坐标获取某窗口的控件ID?没有控件就返回空
本帖最后由 txm888 于 2014-3-27 09:41 编辑请问有不有根据鼠标当前坐标获取窗口中某控件ID的可能,在已知窗口句柄的情况下,
目前论坛的窗口根据鼠标获取控制ID,是在自身窗口内获取,并不能获取第三方软件鼠标下的控件ID,请大侠支招,谢谢!
GUIGetCursorInfo
这函数是用于自己创建的窗口,获取鼠标下的控件ID,现在想实现的是第三方软件如何获取?
真头大了,求帮忙 ;以下代码可以依据坐标取到控件类别名edit
;Local $tar_Title=$wsgpjyxt, $zb1, $zb2
Func _get_ctr_id_by_zb($zb1, $zb2,$tar_Title)
Local $tPoint = DllStructCreate($tagPoint);创建一个 C/C++ 样式的数据结构供 DllCall 使用
DllStructSetData($tPoint, 1, $zb1) ;设置数据结构(struct)中部分元素的数据.
DllStructSetData($tPoint, 2, $zb2)
_WinAPI_ClientToScreen(WinGetHandle($tar_Title), $tpoint);转换客户区窗口指定点的坐标到一个屏幕坐标
$hWnd = _WinAPI_WindowFromPoint($tPoint);检索包含指定点的窗口句柄
;Local $controlid
;$controlid = _WinAPI_GetDlgCtrlID($hWnd);检索指定控件的标识符
;Return $controlid
Return$hWnd
EndFunc
这函数搜出来发现$tagPoint没有声明,获取不到,请问$tagPoint要如何定义呢?
http://www.autoitx.com/forum.php?mod=viewthread&tid=35851&extra=&highlight=%BF%D8%BC%FE&page=2
文章在这里 回复 1# txm888
Func _GetWinInfoFromPoint($title, $text, $_x, $_y, $RtFlag = 1)
;afan提示:本函数用于获取窗口指定坐标点包含的窗口(控件)的句柄、id、文本信息
;$title - 窗口标题(也可直接使用句柄)
;$text - 窗口文本(如果$title使用句柄则该参数被忽略)
;$_x - 控件相对窗口坐标x
;$_y - 控件相对窗口坐标y
;$RtFlag - 返回信息标志[可选参数]
; = 1 返回窗口(或控件)句柄(默认)
; = 2 返回控件的内部标识符(id)
; = 3 返回控件文本
;返回值:@Error =0 根据返回标志返回字符串信息
; @Error =1:未匹配到目标窗口;=2:检索句柄错误;=3:检索id错误;=4:拾取控件文本错误
Local $hWnd = Hwnd($title)
If Not IsHwnd($hWnd) Then
$hWnd = WinGetHandle($title, $text)
If @Error Then Return SetError(1, '', '')
EndIf
Local $tPoint = DllStructCreate('long X;long Y')
DllStructSetData($tPoint, 1, $_x)
DllStructSetData($tPoint, 2, $_y)
DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tPoint))
Local $tPointCast = DllStructCreate('int64', DllStructGetPtr($tPoint))
Local $aRt0 = DllCall('user32.dll', 'hwnd', 'WindowFromPoint', 'int64', DllStructGetData($tPointCast, 1))
If @error Then Return SetError(2, '', '')
$hStatic = $aRt0
Switch $RtFlag
Case 1
Return $hStatic
Case 2
Local $aRt1 = DllCall('user32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hStatic)
If @error Then Return SetError(3, '', '')
Return $aRt1
Case 3
Local $sTxt = ControlGetText($hWnd, '', $hStatic)
If @error Then Return SetError(4, '', '')
Return $sTxt
EndSwitch
EndFunc ;==>_GetWinInfoFromPoint
http://www.autoitx.com/forum.php?mod=viewthread&tid=36184&highlight=%BF%D8%BC%FE
如上A版的UDF函数写得不错,不过,这是通过用户坐标来获取控制ID的,而我想要的是通过鼠标的坐标来获取控件ID,现在的问题困惑在如果将屏幕坐标转成用户坐标 是不是像窗口信息工具那样~ 本帖最后由 风行者 于 2014-3-27 11:51 编辑
#include <WinApiex.au3>
sleep(3000) ;移动鼠标到窗口的时间
Local $pos = MouseGetPos()
Local $tpoint = _WinAPI_CreatePoint($pos, $pos)
Local $hwnd = _WinAPI_WindowFromPoint($tpoint)
MsgBox(64, "", "窗口句柄:" & $hwnd & @CRLF & _
"窗口类名:" & _WinAPI_GetClassName($hwnd) & @CRLF & _
"窗口标题:" & WinGetTitle($hwnd))
页:
[1]