找回密码
 加入
搜索
楼主: lon91ong

[系统综合] [已解决]后台发送鼠标点击事件的坐标问题

 火... [复制链接]
 楼主| 发表于 2010-12-31 16:21:45 | 显示全部楼层
回复 13# ceoguang

这个是前台的鼠标坐标计算办法,后台的应该是我上面给出的那个公式!
但是不明白为什么是那样的!

直觉上,如果直接发送给控件的话,应该取控件中的鼠标坐标
也就是(窗口鼠标坐标-窗口控件坐标),而事实上确实“+”,很是莫名其妙!
 楼主| 发表于 2010-12-31 16:25:17 | 显示全部楼层
不对,直接就是鼠标坐标.而且这个座标是对应整个屏幕的
ceoguang 发表于 2010-12-31 16:19



   后台点击,怎么取整个屏幕的坐标???
那上面的(200,237)是怎么回事???
发表于 2010-12-31 16:54:58 | 显示全部楼层
本帖最后由 ceoguang 于 2010-12-31 16:56 编辑

好吧,我再一次样子有问题.

#include <WinAPI.au3>
#include <SendMessage.au3>

Local $iX, $iY

$hwnd = WinGetHandle("计算器")
$Hwnd_Bottom5 = _WinAPI_GetDlgItem($hwnd, 129) ;计算器上5的按键的句柄
$tRect = _WinAPI_GetWindowRect($Hwnd_Bottom5)
$iLeft = DllStructGetData($tRect, "Left") ;屏幕左侧距离
$iTop = DllStructGetData($tRect, "Top") ;屏幕顶部距离
$iRight = DllStructGetData($tRect, "Right") ;屏幕右侧距离
$iBottom = DllStructGetData($tRect, "Bottom") ;屏幕底部距离
;$iRight - $iLeft 控件的宽度
;$iBottom - $iTop 控件的高度
$iX = $iLeft + ($iRight - $iLeft) / 2 ;取控件的中央点
$iY = $iTop + ($iBottom - $iTop) / 2 ;;取控件的中央点
Local $ilParam = BitOR($iY * 65536, BitAND($iX, 65535))

_SendMessage(_WinAPI_GetDlgItem($hwnd, 129), 0x0201, $ilParam) ;计算器上5的控件ID是129
_SendMessage(_WinAPI_GetDlgItem($hwnd, 129), 0x0202, $ilParam)

评分

参与人数 1金钱 +20 收起 理由
lon91ong + 20 受教了,多谢版主大大!

查看全部评分

发表于 2010-12-31 17:34:06 | 显示全部楼层
本帖最后由 半芯蕃茄 于 2010-12-31 17:38 编辑

不用那么复杂。。
ControlClick("计算器", "CE", "[CLASSNN:Button9; TEXT:8; INSTANCE:9]") 
一句就搞定,后台点击 8  ,最小化也可以。。。简单,容易理解,不需要调用API
发表于 2010-12-31 17:58:11 | 显示全部楼层
下面为更简单的实例:8+9=
ControlClick("计算器", "Backspace", "[ID:132]");此为点击8
ControlClick("计算器", "Backspace", "[ID:92]");此为点击+号
ControlClick("计算器", "Backspace", "[ID:133]");此为点击9
ControlClick("计算器", "Backspace", "[ID:112]");此为点击=号
后台测试成功,最小化测试成功。。
 楼主| 发表于 2010-12-31 22:40:38 | 显示全部楼层
楼上的同样感谢了,不过你的代码不是我想要的关于坐标的东西!
 楼主| 发表于 2010-12-31 23:39:34 | 显示全部楼层
本帖最后由 lon91ong 于 2010-12-31 23:49 编辑

回复 18# ceoguang

你的那个坐标算法明白了
$iX=控件对屏幕的横坐标+控件的一半宽度
$iY=控件对屏幕的纵坐标+控件的一半高度
你这个公式在窗口最小化之后,得到的是一对负值,可是依然有效,真的很神奇!
可是我算了半天,还是没有算明白,为什么我的那个公式得到的结果和你的一样的!
我的公式:
目标坐标=鼠标对窗口的坐标+控件的坐标
经过我的测试,确实是没有问题的!
发表于 2011-1-1 07:24:52 | 显示全部楼层
绝对坐标往往跟分辨率有关,适合它的不一定适合你的。
发表于 2011-1-1 07:32:05 | 显示全部楼层
你得看坐标原点是不是在屏幕中央,这样是有负值的。还有control系列函数是钩子钩的,跟获得句柄获取坐标没啥本质区别,不过一般采用窗体坐标系。原点在左上角
发表于 2011-1-1 07:36:27 | 显示全部楼层
看看opt函数或许有点帮助
 楼主| 发表于 2011-1-1 08:58:25 | 显示全部楼层
回复 25# fhp2009

需要学习的地方还有很多啊!
版主给的那个算法是通用的,不过就是不懂为什么最小化后得负数依然有效 >_<
发表于 2011-1-1 09:13:18 | 显示全部楼层
回复  ceoguang

你的那个坐标算法明白了你这个公式在窗口最小化之后,得到的是一对负值,可是依然有效,真 ...
lon91ong 发表于 2010-12-31 23:39

看来你还是不明白,前面已经说了,直接就是屏幕座标,屏幕座标只有在分辨内时才是正数,加不加控件本身都是可以的.关于此问题,建议你去了解下screentoclient或clienttoscreen
你得看坐标原点是不是在屏幕中央,这样是有负值的。还有control系列函数是钩子钩的,跟获得句柄获取坐标没啥 ...
fhp2009 发表于 2011-1-1 07:32

据我所了解,control*系列函数并没有使用勾子,而且是一定要有句柄.
 楼主| 发表于 2011-1-1 10:36:02 | 显示全部楼层
虽然把版主最后给的计算方法整明白了,但是版主在11楼给的那个简单的代码中使用的坐标
;座标200,237
Local $iX = 200, $iY = 237
还是不明白怎么算的,这个坐标和窗口在屏幕中的位置是无关的,而上面给的算法却是和窗口位置相关的!
 楼主| 发表于 2011-1-1 10:52:53 | 显示全部楼层
目标控件以计算器窗口中的按钮"5"为例
客户区原点的窗口坐标:3,42
目标控件客户区坐标:93,98
目标控件大小:36,27
控件中心的窗口坐标:
    横坐标:93+3+36/2=114
    纵坐标:98+42+27/2=153.5

点击坐标=控件中心的窗口坐标+目标控件客户区坐标
$iX=114+93=207
$iY=153.5+98=241.5
 楼主| 发表于 2011-1-1 12:15:47 | 显示全部楼层
刚刚发现一个致命的问题,IE窗口取不到控件ID,如下图所示,这可如何是好呢?!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 19:47 , Processed in 0.073364 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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