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,如下图所示,这可如何是好呢?!
页: 1 [2] 3 4 5 6
查看完整版本: [已解决]后台发送鼠标点击事件的坐标问题