找回密码
 加入
搜索
查看: 4176|回复: 4

[AU3基础] 请问如何通过屏幕鼠标坐标获取某窗口的控件ID?没有控件就返回空

[复制链接]
发表于 2014-3-26 17:34:28 | 显示全部楼层 |阅读模式
本帖最后由 txm888 于 2014-3-27 09:41 编辑

请问有不有根据鼠标当前坐标获取窗口中某控件ID的可能,在已知窗口句柄的情况下,
目前论坛的窗口根据鼠标获取控制ID,是在自身窗口内获取,并不能获取第三方软件鼠标下的控件ID,请大侠支招,谢谢!

GUIGetCursorInfo
这函数是用于自己创建的窗口,获取鼠标下的控件ID,现在想实现的是第三方软件如何获取?
真头大了,求帮忙
 楼主| 发表于 2014-3-27 08:38:53 | 显示全部楼层
;以下代码可以依据坐标取到控件类别名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 ... D8%BC%FE&page=2
文章在这里
 楼主| 发表于 2014-3-27 09:04:31 | 显示全部楼层
回复 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[0]
        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[0]
                Case 3
                        Local $sTxt = ControlGetText($hWnd, '', $hStatic)
                        If @error Then Return SetError(4, '', '')
                        Return $sTxt
        EndSwitch
EndFunc   ;==>_GetWinInfoFromPoint

http://www.autoitx.com/forum.php ... hlight=%BF%D8%BC%FE
如上A版的UDF函数写得不错,不过,这是通过用户坐标来获取控制ID的,而我想要的是通过鼠标的坐标来获取控件ID,现在的问题困惑在如果将屏幕坐标转成用户坐标
发表于 2014-3-27 10:28:22 | 显示全部楼层
是不是像窗口信息工具那样~
发表于 2014-3-27 11:47:12 | 显示全部楼层
本帖最后由 风行者 于 2014-3-27 11:51 编辑

#include <WinApiex.au3>
sleep(3000) ;移动鼠标到窗口的时间
Local $pos = MouseGetPos()
Local $tpoint = _WinAPI_CreatePoint($pos[0], $pos[1])
Local $hwnd = _WinAPI_WindowFromPoint($tpoint)
MsgBox(64, "", "窗口句柄:" & $hwnd & @CRLF & _
                "窗口类名:" & _WinAPI_GetClassName($hwnd) & @CRLF & _
                "窗口标题:" & WinGetTitle($hwnd))
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 02:02 , Processed in 0.077543 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表