lon91ong
发表于 2010-12-31 16:21:45
回复 13# ceoguang
这个是前台的鼠标坐标计算办法,后台的应该是我上面给出的那个公式!
但是不明白为什么是那样的!
直觉上,如果直接发送给控件的话,应该取控件中的鼠标坐标
也就是(窗口鼠标坐标-窗口控件坐标),而事实上确实“+”,很是莫名其妙!{:face (245):}
lon91ong
发表于 2010-12-31 16:25:17
不对,直接就是鼠标坐标.而且这个座标是对应整个屏幕的
ceoguang 发表于 2010-12-31 16:19 http://www.autoitx.com/images/common/back.gif
后台点击,怎么取整个屏幕的坐标???
那上面的(200,237)是怎么回事???{:face (189):}
ceoguang
发表于 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)
半芯蕃茄
发表于 2010-12-31 17:34:06
本帖最后由 半芯蕃茄 于 2010-12-31 17:38 编辑
不用那么复杂。。ControlClick("计算器", "CE", "") 一句就搞定,后台点击 8,最小化也可以。。。简单,容易理解,不需要调用API
半芯蕃茄
发表于 2010-12-31 17:58:11
下面为更简单的实例:8+9=
ControlClick("计算器", "Backspace", "");此为点击8
ControlClick("计算器", "Backspace", "");此为点击+号
ControlClick("计算器", "Backspace", "");此为点击9
ControlClick("计算器", "Backspace", "");此为点击=号后台测试成功,最小化测试成功。。
lon91ong
发表于 2010-12-31 22:40:38
楼上的同样感谢了,不过你的代码不是我想要的关于坐标的东西!
lon91ong
发表于 2010-12-31 23:39:34
本帖最后由 lon91ong 于 2010-12-31 23:49 编辑
回复 18# ceoguang
你的那个坐标算法明白了
$iX=控件对屏幕的横坐标+控件的一半宽度
$iY=控件对屏幕的纵坐标+控件的一半高度
你这个公式在窗口最小化之后,得到的是一对负值,可是依然有效,真的很神奇!{:face (125):}
可是我算了半天,还是没有算明白,为什么我的那个公式得到的结果和你的一样的!
我的公式:
目标坐标=鼠标对窗口的坐标+控件的坐标
经过我的测试,确实是没有问题的!{:face (207):}
fhp2009
发表于 2011-1-1 07:24:52
绝对坐标往往跟分辨率有关,适合它的不一定适合你的。
fhp2009
发表于 2011-1-1 07:32:05
你得看坐标原点是不是在屏幕中央,这样是有负值的。还有control系列函数是钩子钩的,跟获得句柄获取坐标没啥本质区别,不过一般采用窗体坐标系。原点在左上角
fhp2009
发表于 2011-1-1 07:36:27
看看opt函数或许有点帮助
lon91ong
发表于 2011-1-1 08:58:25
回复 25# fhp2009
需要学习的地方还有很多啊!
版主给的那个算法是通用的,不过就是不懂为什么最小化后得负数依然有效 >_<
ceoguang
发表于 2011-1-1 09:13:18
回复ceoguang
你的那个坐标算法明白了你这个公式在窗口最小化之后,得到的是一对负值,可是依然有效,真 ...
lon91ong 发表于 2010-12-31 23:39 http://www.autoitx.com/images/common/back.gif
看来你还是不明白,前面已经说了,直接就是屏幕座标,屏幕座标只有在分辨内时才是正数,加不加控件本身都是可以的.关于此问题,建议你去了解下screentoclient或clienttoscreen
你得看坐标原点是不是在屏幕中央,这样是有负值的。还有control系列函数是钩子钩的,跟获得句柄获取坐标没啥 ...
fhp2009 发表于 2011-1-1 07:32 http://www.autoitx.com/images/common/back.gif
据我所了解,control*系列函数并没有使用勾子,而且是一定要有句柄.
lon91ong
发表于 2011-1-1 10:36:02
虽然把版主最后给的计算方法整明白了,但是版主在11楼给的那个简单的代码中使用的坐标
;座标200,237
Local $iX = 200, $iY = 237
还是不明白怎么算的,这个坐标和窗口在屏幕中的位置是无关的,而上面给的算法却是和窗口位置相关的!
{:face (396):}
lon91ong
发表于 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
lon91ong
发表于 2011-1-1 12:15:47
刚刚发现一个致命的问题,IE窗口取不到控件ID,如下图所示,这可如何是好呢?!