autoit 发表于 2008-5-3 14:20:25

解决鼠标操作的可靠性

<p>偶尔会遇到一些非常规的安装窗体,不能用完全用键盘操控,在AutoIt Spy里又找不到控件,这时唯一的方法就是用鼠标操作。如何解决鼠标操作时坐标的准确性和坐标的通用性成为要解决的主要问题。 </p><p>&nbsp;&nbsp;&nbsp; 偶尔会遇到一些非常规的安装窗体,不能用完全用键盘操控,在AutoIt Spy里又找不到控件,这时唯一的方法就是用鼠标操作。如何解决鼠标操作时坐标的准确性和坐标的通用性成为要解决的主要问题。</p><p>&nbsp;&nbsp;&nbsp; 一般情况下窗体的大小和控件在窗体里的位置都是固定的,因此控件和窗体的相对位置成为解决鼠标坐标的切入点。<br />&nbsp;&nbsp;&nbsp; 由于MouseClick()函数中鼠标的坐标是屏幕里的绝对坐标,所以我曾经使用过先取得窗体坐标,再计算控件坐标的方法。如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $st=WinGetPos()&nbsp;&nbsp;&nbsp; ;取得窗体坐标</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ButtonX=$st+458&nbsp;&nbsp;&nbsp; ;计算控件X坐标</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ButtonY=$st+305&nbsp;&nbsp;&nbsp; ;计算控件Y坐标</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseClick( &quot;left&quot;, $ButtonX, $ButtonY );在X、Y坐标上单击一次</p><p>&nbsp;&nbsp;&nbsp; 虽然上面的方法没有问题,但实际上AutoIt提供了鼠标相对窗体坐标的解决方法,那就是切换鼠标坐标模式Opt(&quot;MouseCoordMode&quot;, 1) </p><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opt(&quot;MouseCoordMode&quot;, 1)&nbsp;&nbsp;&nbsp; ;1=绝对坐标,相对屏幕, 0=相对坐标,相对当前激活窗体</p><p>&nbsp;&nbsp;&nbsp; 切换过鼠标坐标模式后,在使用鼠标操作时坐标就可以直接使用相对当前激活窗体的,避免了上面的计算。</p><p><br />&nbsp;&nbsp;&nbsp; 上面的操作虽然没有问题但使用时有一个隐含条件,窗体必须完全在屏幕内(至少控件部分),因为鼠标无法点到屏幕外的地方。现实中还是有这种可能的,除去人为因素外,低分辨率是一个直接因素。目前本人能想到两个方法,一是改变分辨率,但还没有找到对应的命令,而且不同的显示器能调节的范围也不一样,这个方法有待考证;另一个方法是将窗体移动到屏幕内,这个方法很容易实现。</p><p>&nbsp;&nbsp;&nbsp; 下面是移动窗体方法在安装Kv2004的应用</p><p>&nbsp;&nbsp;&nbsp; $st=WinGetPos(&quot;江民杀毒软件KV2004&quot;,&quot;欢迎进入&quot;)</p><p>&nbsp;&nbsp;&nbsp; if $st+$st&gt;@DesktopWidth Then</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:$mx=@DesktopWidth-$st</p><p>&nbsp;&nbsp;&nbsp; Else</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $mx=$st</p><p>&nbsp;&nbsp;&nbsp; EndIf</p><p>&nbsp;&nbsp;&nbsp; if $st+$st&gt;@DesktopHeight Then</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:$my=@DesktopHeight-$st-35" target="_blank">$my=@DesktopHeight-$st-35</a></p><p>&nbsp;&nbsp;&nbsp; Else</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $my=$st</p><p>&nbsp;&nbsp;&nbsp; EndIf</p><p>&nbsp;&nbsp;&nbsp; if $mx&lt;$st or $my&lt;$st Then</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WinMove(&quot;江民杀毒软件KV2004&quot;,&quot;欢迎进入&quot;,$mx,$my)</p><p>&nbsp;&nbsp;&nbsp; EndIf</p><p>&nbsp;&nbsp;&nbsp; 在这段脚本中,先取得当前窗体的位置到数组st中,再判断窗体的右边和下边是否有超出屏幕的,计算出恰好在屏幕内时的位置。如果这个位置小于原坐标则进行移动。</p><p>&nbsp;&nbsp;&nbsp; 上面一句<a href="mailto:$my=@DesktopHeight-$st-35" target="_blank">$my=@DesktopHeight-$st-35</a>,是设置调整到的Y坐标位置,之所以又减35,是为了避开任务栏。</p><p>&nbsp;&nbsp;&nbsp; 另外上面的方法在实际应用中也不是一成不变的,上面只是考虑窗体右边和下边移入窗口(因为大多安装安装窗体的操作控件在偏右下的位置),但左边和上面是不是在窗体里就不一定了。其实应该以控件是否可以为中心,当然还是这个思路。编写脚本时做相应的修改。</p><p></p><p>总之:解决窗体是否在屏幕里,然后切换鼠标模式到相对激活窗体,是目前解决鼠标操作可靠性的关键</p>

idic754 发表于 2008-6-23 07:10:13

能帮我解决这个问题!`是这样的!~

我这网吧装了ikeeper收费软件,我想在桌面弄个消费查询的快捷方式,但是那个任务栏里的控制图标会因系统启动的原因不是在固定的地方,用鼠标定位很难,不知道用你这能不能实现!

我是新手正准备学AU3,能帮研究下吗!~谢谢!~

idic754 发表于 2008-6-23 07:13:46

下面是代码

MouseClick("left", 970, 750, 1)
MouseMove(970, 750)
MouseMove(959, 561, 2)
MouseMove(959, 561)
MouseMove(842, 569, 2)
MouseDown("left")
Sleep(100)
MouseUp("left")

vv3509 发表于 2008-6-23 15:43:49

很好的想法,很受启发,谢谢楼主了

jtzxgfy 发表于 2008-7-7 00:57:06

谢谢楼主,切换过鼠标坐标模式,很有用

llztt 发表于 2008-7-7 16:43:29

支持喜欢研究的

星驰周 发表于 2008-7-7 21:24:52

再给楼主补个问题,望楼主再给完善一下

非常规的窗口,应该不光是位置会超过屏幕,而大小可能有不常规而长出屏幕,比如超长的音量选项栏
我并不是说不能解决,而说还需要增加if的判断了。不说这个,看下面的:

有时会有置顶的窗口挡到要操作的窗口,如何更有效的解决这一问题?(知道要用到判断,就需要具体的代码了。)



---------------------------------------------
还有一个一直想“直接解决”的难题,针对QQ安装过程中的中文搜搜有什么自动去勾的好办法没?
如果有版主楼主能一块解决,真是太好了!的

[ 本帖最后由 星驰周 于 2008-7-7 21:29 编辑 ]

qop1830 发表于 2008-7-8 23:28:16

QQ安装过程中的中文搜搜去不到是因为已经安装了中文搜搜   所以点了没反映!

gxbhzb 发表于 2008-7-14 11:30:53

分辨率不同,显示器不同(比如是宽屏)也影响控件坐标的啊

qq82015930 发表于 2009-1-30 16:18:57

原帖由 idic754 于 2008-6-23 07:13 发表 http://www.autoitx.com/images/common/back.gif
下面是代码

MouseClick("left", 970, 750, 1)
MouseMove(970, 750)
MouseMove(959, 561, 2)
MouseMove(959, 561)
MouseMove(842, 569, 2)
MouseDown("left")
Sleep(100)
MouseUp("left")



MouseClick("right", 1226, 1010, 4)
MouseClick("left", 1199, 956, 1)
这样还简单点,
前面加判断分辨率

sxd 发表于 2009-1-30 17:18:48

这里提供一个 取相对坐标的方法

想winmove到 0,0 在spy抓坐标 就是 相对坐标

augual 发表于 2009-1-31 22:58:09

解决鼠标操作的可靠性

先设置分辨置,AU3有设置分辨率,先设置成800*600 75HZ的,然后取绝对路径,只要不超过屏幕就可以了。这个可靠性就高了。
如果有需要设置分辨率的我可以提供代码.
;下面是获取鼠标位置的脚本。
;===========================================================
TrayTip("鼠标位置脚本", "ALT+A显示鼠标位置,ALT+S关闭", 5, 1)
While 1
HotKeySet("!a", "m_xy");滑鼠座標獲得
HotKeySet("!s", "my_exit")
WEnd
Func m_xy();---滑鼠座標獲得
        $pos = MouseGetPos()
        MsgBox(0, "滑鼠的座標為", $pos & "," & $pos)
EndFunc   ;==>m_xy

Func my_exit()
        Exit
EndFunc   ;==>my_exit
;============================================================

[ 本帖最后由 augual 于 2009-1-31 23:01 编辑 ]

xrbenbeba 发表于 2009-2-2 08:53:55

学习了学习了学习了学习了

ljsoso 发表于 2009-11-27 17:29:14

不是很明白

hang1005 发表于 2009-12-1 00:09:32

正在学习之中
页: [1] 2
查看完整版本: 解决鼠标操作的可靠性