[已解决]后台发送鼠标点击事件的坐标问题
本帖最后由 lon91ong 于 2011-1-4 14:41 编辑看了3个多小时的帖子,最后找到的实现发送后台鼠标事件的方式是PostMessage_UDF.au3中的_MouseClick()方法.
#include <PostMessage_UDF.au3>
$Hwnd = WinGetHandle("计算器")
_MouseClick($hWnd, "left", 19, 12)
_SendText($Hwnd,"9");后台发送点击9的消息
lynfr8 发表于 2009-5-15 02:07 http://www.autoitx.com/images/common/back.gif
实在是不明白那个坐标是怎么取的?既不是相对坐标,也不是绝对坐标!到底怎么取呢 ?
望大虾解疑?! 本帖最后由 lon91ong 于 2010-12-30 17:59 编辑
我试过的方法还有MouseClickPlus.au3
同样也是搞不清楚坐标的传递问题,如下图
我想要在后台用鼠标点击按钮"5",编写代码如下:
#Include "MouseClickPlus.au3"
Dim $Title="计算器"
Dim $button="left"
_MouseClickPlus($Title,$button,110,110)
坐标取的是计算器整个窗口的相对坐标,93+17=110,98+12=110
运行之后,没有实现预期输入"5"的目标!
请大侠解疑?! 你用MouseMove 先看看你的鼠标点到哪里去了
除了绝对坐标 窗口坐标 有时还有控件坐标和标题栏高度在里面 也要计算进去 坐标分为屏幕坐标,窗口坐标,还有客户区坐标,那个信息工具中-选项那里可以设置 多谢提醒,晚上试试!现在是手机上网! 什么是后台鼠标?光标不动? 回复 6# fhp2009
是啊,就是不想打断用户现在的操作,在后台模拟鼠标点击事件!
#include <WinAPI.au3>
#include <SendMessage.au3>
$Hwnd = WinGetHandle("计算器")
;-------点击清除键C
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 81), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 81), 0x0202, 0)
;-------点击5
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0202, 0)
;-------点击+
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 92), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 92), 0x0202, 0)
;-------点击5
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0202, 0)
;-------等于
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 112), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 112), 0x0202, 0)
;操作是点击:5+5=
WinActive($Hwnd)
MsgBox(262208,"看到了没有","结果是10吧!",-1,$Hwnd)
更专业一点,最小化后才操作
#include <WinAPI.au3>
#include <SendMessage.au3>
Run(@SystemDir & "\calc.exe")
WinWait("计算器","",5);等待5秒
$Hwnd = WinGetHandle("计算器")
_WinAPI_ShowWindow($Hwnd,@SW_HIDE ) ;最小化计算器
MsgBox(262208,"","计算器被最小化")
;-------点击清除键C
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 81), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 81), 0x0202, 0)
;-------点击5
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0202, 0)
;-------点击+
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 92), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 92), 0x0202, 0)
;-------点击5
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 129), 0x0202, 0)
;-------等于
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 112), 0x0201, 0)
_SendMessage(_WinAPI_GetDlgItem($Hwnd, 112), 0x0202, 0)
;操作是点击:5+5=
MsgBox(262208,"","去看看结果是不是10!",-1,$Hwnd)
_WinAPI_ShowWindow($Hwnd,@SW_RESTORE)
WinActive($Hwnd)
本帖最后由 lon91ong 于 2010-12-31 12:24 编辑
多谢版主的解答!
你的代码我在Win2K3 Server的系统中测试,如果先自己打开了"计算器"的话,脚本不能取得预期结果!
如果用第二个代码,脚本自行启动"计算器"的话,才能得到预期结果!
另外,你采用的是取得窗口控件的方式,直接发送事件给控件了,并没有涉及到坐标的问题!
如果我想用来点击网页上的东西,比如flash游戏,是不是就没办法了呢?{:face (396):} 我晕,要学会变通
#include <WinAPI.au3>
#include <SendMessage.au3>
$Hwnd = WinGetHandle("计算器")
;座标200,237
Local $iX = 200, $iY = 237
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)
本帖最后由 lon91ong 于 2010-12-31 16:02 编辑
汗死,我就是这里不懂怎么用的,版主大大你把这里省略了我就傻眼了!
还有就是,那个(200,237)的坐标到底是怎么取的呢?
我把屏幕、窗口、客户区挨个试,一个都不对啊!{:face (316):} 好吧,我具体说说调试的方法
先运行计算器,然后用窗口信息工具取到计算器上5的座标
看图
在综合一栏里可以看到
>>>> 鼠标 <<<<
坐标: 778, 455
光标 ID: 0
颜色: 0xD4D0C8
其中
778, 455
分别换成代码中的$iX及$iY,执行就可以看到5被点击了,但这期间计算器窗口座标不能变动.否则就点错地方或点不到了 本帖最后由 lon91ong 于 2010-12-31 16:17 编辑
我整了半天,凑数凑出来一个公式
窗口中的鼠标坐标+窗口中的控件坐标
不知对不对?
试了试别的按钮,应该是没错的!
可是只知其然,不知其所以然,挺莫名奇妙的!{:face (396):} 不对,直接就是鼠标坐标.而且这个座标是对应整个屏幕的