lon91ong 发表于 2010-12-30 17:36:01

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

本帖最后由 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:55:41

本帖最后由 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"的目标!

请大侠解疑?!

lainline 发表于 2010-12-30 18:00:08

你用MouseMove 先看看你的鼠标点到哪里去了

除了绝对坐标 窗口坐标 有时还有控件坐标和标题栏高度在里面 也要计算进去

飘云 发表于 2010-12-30 19:20:17

坐标分为屏幕坐标,窗口坐标,还有客户区坐标,那个信息工具中-选项那里可以设置

lon91ong 发表于 2010-12-30 19:53:43

多谢提醒,晚上试试!现在是手机上网!

fhp2009 发表于 2010-12-30 20:53:06

什么是后台鼠标?光标不动?

lon91ong 发表于 2010-12-31 10:24:21

回复 6# fhp2009

是啊,就是不想打断用户现在的操作,在后台模拟鼠标点击事件!

ceoguang 发表于 2010-12-31 11:32:04


#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)

ceoguang 发表于 2010-12-31 11:43:40

更专业一点,最小化后才操作

#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:21:39

本帖最后由 lon91ong 于 2010-12-31 12:24 编辑

多谢版主的解答!

你的代码我在Win2K3 Server的系统中测试,如果先自己打开了"计算器"的话,脚本不能取得预期结果!
如果用第二个代码,脚本自行启动"计算器"的话,才能得到预期结果!


另外,你采用的是取得窗口控件的方式,直接发送事件给控件了,并没有涉及到坐标的问题!
如果我想用来点击网页上的东西,比如flash游戏,是不是就没办法了呢?{:face (396):}

ceoguang 发表于 2010-12-31 13:14:41

我晕,要学会变通

#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 15:49:53

本帖最后由 lon91ong 于 2010-12-31 16:02 编辑

汗死,我就是这里不懂怎么用的,版主大大你把这里省略了我就傻眼了!

还有就是,那个(200,237)的坐标到底是怎么取的呢?
我把屏幕、窗口、客户区挨个试,一个都不对啊!{:face (316):}

ceoguang 发表于 2010-12-31 16:03:56

好吧,我具体说说调试的方法
先运行计算器,然后用窗口信息工具取到计算器上5的座标
看图

在综合一栏里可以看到
>>>> 鼠标 <<<<
坐标:        778, 455
光标 ID:        0
颜色:        0xD4D0C8
其中
778, 455
分别换成代码中的$iX及$iY,执行就可以看到5被点击了,但这期间计算器窗口座标不能变动.否则就点错地方或点不到了

lon91ong 发表于 2010-12-31 16:14:05

本帖最后由 lon91ong 于 2010-12-31 16:17 编辑

我整了半天,凑数凑出来一个公式

窗口中的鼠标坐标+窗口中的控件坐标

不知对不对?

试了试别的按钮,应该是没错的!

可是只知其然,不知其所以然,挺莫名奇妙的!{:face (396):}

ceoguang 发表于 2010-12-31 16:19:12

不对,直接就是鼠标坐标.而且这个座标是对应整个屏幕的
页: [1] 2 3 4 5 6
查看完整版本: [已解决]后台发送鼠标点击事件的坐标问题