找回密码
 加入
搜索
楼主: lon91ong

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

 火... [复制链接]
 楼主| 发表于 2011-1-1 12:19:52 | 显示全部楼层
本帖最后由 lon91ong 于 2011-1-1 12:29 编辑

怎么能绕开取控件,直接把鼠标的点击事件和坐标发送给窗口句柄呢?

用PostMessage方法不用取控件,它直接发送事件给窗口,但是它的坐标我不会计算,用前面的算法也行不通!

下面是PostMessage_UDF中的鼠标点击事件部分的代码
Func _MakeLong($LoWord, $HiWord)
        Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc

Func _MouseClick($hWnd, $button, $x, $y, $times=1, $delay=250)
        If $hWnd = 0 Then
                SetError(-1)
                Return
        EndIf
        
        Local $ix
        Local $lParam = _MakeLong($x, $y)
        Local $user32 = DllOpen("user32.dll")
        
        $button = StringLower($button)
        
        If $button = "left" Then
                For $ix = 1 To $times
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x200, "int", 0, "long", $lParam)
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x201, "int", 1, "long", $lParam)
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x202, "int", 0, "long", $lParam)
                        
                        If $ix < $times Then Sleep($delay)
                Next
        ElseIf $button = "right" Then
                For $ix = 1 To $times
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x200, "int", 0, "long", $lParam)
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x204, "int", 2, "long", $lParam)
                        DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", 0x205, "int", 0, "long", $lParam)
                        
                        If $ix < $times Then Sleep($delay)
                Next
        Else
                SetError(-2)
                If $user32 <> -1 Then DllClose($user32)
                Return
        EndIf
        If $user32 <> -1 Then DllClose($user32)
EndFunc
它的坐标我不知道应该怎么计算!
发表于 2011-1-1 13:20:22 | 显示全部楼层
怎么能绕开取控件,直接把鼠标的点击事件和坐标发送给窗口句柄呢?

用PostMessage方法不用取控件,它直接发 ...
lon91ong 发表于 2011-1-1 12:19

我前面的代码就跟这个UDF原理是一样的,只是这个封装成自定义函数了,提供了更为详尽的参数,使用的是PostMessage,而且会先发送鼠标移动到控件上的消息.这个也是要控件句柄的,座标算法跟前面的一样.
发表于 2011-1-1 13:23:18 | 显示全部楼层
刚刚发现一个致命的问题,IE窗口取不到控件ID,如下图所示,这可如何是好呢?!
lon91ong 发表于 2011-1-1 12:15

没说一定要ID,前面只不过是用计算器做示例,所以才有ID一说,浏览器的话直接发到主窗口应该就可以了,不过座标的话就要事先取好了
 楼主| 发表于 2011-1-1 13:24:00 | 显示全部楼层
本帖最后由 lon91ong 于 2011-1-1 13:29 编辑

回复 32# ceoguang


    那如果像IE的页面区,取不到控件ID该怎么办呢?



有没有办法用[CLASS:Internet Explorer_Server; INSTANCE:1]来取得控件句柄呢????
发表于 2011-1-1 13:28:58 | 显示全部楼层
见33#
座标只能第三方取.
 楼主| 发表于 2011-1-1 13:32:34 | 显示全部楼层
回复 35# ceoguang


第三方取? 不懂!
可以给个例子吗?  比如点击论坛首页的"发帖"
发表于 2011-1-1 13:37:46 | 显示全部楼层
第三方取的意思是通过第三方工具来取.
要不就像游戏外挂一样,通过找图,找色,找字来实现
发表于 2011-1-1 20:26:44 | 显示全部楼层
初来乍到 好好学习一下
发表于 2011-1-4 10:26:13 | 显示全部楼层
做个记号,以后再再学习
发表于 2011-1-4 11:09:08 | 显示全部楼层
好东西就是顶起来
发表于 2011-1-4 11:09:15 | 显示全部楼层
好东西就是顶起来
发表于 2011-1-4 11:09:19 | 显示全部楼层
好东西就是顶起来
发表于 2011-1-4 11:09:32 | 显示全部楼层
实在不好意思啊,没分下载了
发表于 2011-1-4 19:37:00 | 显示全部楼层
看了首页  更觉得楼主应该多谢思考  少些提问
 楼主| 发表于 2011-1-4 23:04:51 | 显示全部楼层
本帖最后由 lon91ong 于 2011-1-4 23:07 编辑

今天无意中发现了PostMessage_UDF.au3的坐标取法,原来如此简单(虽然还是不明白他是怎么算的!)


如上图所示,_MouseClick函数接受的句柄是最终事件的接收控件句柄,坐标直接取图中所示的控件点击坐标即可!
不过还有一点疑惑就是,那个控件句柄改怎么通过函数取,尤其是遇到两个同名窗口的情况下!

这个问题我已经另外发帖提出了,至今还没有得到解答!
帖子链接

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 19:48 , Processed in 0.228198 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表