txm888 发表于 2014-3-26 17:34:28

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

本帖最后由 txm888 于 2014-3-27 09:41 编辑

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

GUIGetCursorInfo
这函数是用于自己创建的窗口,获取鼠标下的控件ID,现在想实现的是第三方软件如何获取?
真头大了,求帮忙

txm888 发表于 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?mod=viewthread&tid=35851&extra=&highlight=%BF%D8%BC%FE&page=2
文章在这里

txm888 发表于 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
      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,现在的问题困惑在如果将屏幕坐标转成用户坐标

haijie1223 发表于 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, $pos)
Local $hwnd = _WinAPI_WindowFromPoint($tpoint)
MsgBox(64, "", "窗口句柄:" & $hwnd & @CRLF & _
                "窗口类名:" & _WinAPI_GetClassName($hwnd) & @CRLF & _
                "窗口标题:" & WinGetTitle($hwnd))
页: [1]
查看完整版本: 请问如何通过屏幕鼠标坐标获取某窗口的控件ID?没有控件就返回空