如何在Windows上准确编程自动“点击”?
我写了一个程序,可以在预定的时间自动点击一个应用程序,使用的是Win32,主要用到的命令是 MOUSE_DOWN
和 MOUSE_UP
。这个程序通常运行得不错,但我发现我需要在这两个命令之间加一个
sleep 0.1
(我用的是Ruby,这个语言可以让程序暂停一小段时间)。
如果不加这个暂停,有时候点击就不会成功。不过我还发现,有时候点击的时间“太长”了。这个点击实际上是在一个Flash应用里的右箭头上。这个右箭头是用来切换列表中的下一个项目的。所以如果你按 MOUSE_DOWN
的时间稍微长一点,它可能会一次性切换2到3个项目,而不是只切换1个。
所以我在想,有没有办法准确模拟一次点击呢?可能没有 MOUSE_CLICK
这个事件吧?必须用 MOUSE_DOWN
和 MOUSE_UP
来模拟吗?
(在Win32中,实际上叫做 MOUSEEVENTF_LEFTDOWN
和 MOUSEEVENTF_LEFTUP
,为了简单起见,这里就称作 MOUSE_DOWN
了。)
6 个回答
我会推荐使用AutoHotKey。它是开源的,而且是免费的,已经存在很长时间了,并且还在不断更新维护,甚至有人为它开发了一个集成开发环境(IDE)。我用它来生成独特的随机测试数据,用于表单测试,不过它也可以做一些鼠标操作的事情。
如果你不局限于某种特定的编程语言,可以看看AutoIt。这个工具专门用来处理类似的事情。我用它来自动化一些操作,比如鼠标点击或者键盘输入,效果很好。
你并不能决定鼠标按下和松开之间的延迟设置是什么样的才能算作一次有效的单击,这个是由操作系统来决定的。
没有任何一个 sleep
函数能够保证你想要的鼠标按下和松开事件之间的时间间隔。Perl 的 Win32::GuiTest 模块可以让你发送一个实际的点击事件,而不是去纠结按下和松开事件的时间。后来:查看源代码后,发现 Win32::GuiTest 似乎只是直接触发鼠标按下和松开的事件,中间没有任何延迟 见 GuiTest.pm:
elsif ( $item =~ /leftclick/i ) {
SendLButtonDown ();
SendLButtonUp ();
}
此外,http://msdn.microsoft.com/en-us/library/ms646260(VS.85).aspx 说明 mouse_event
已经被 SendInput
替代 http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx,这个可以让你发送带有时间戳等信息的 MOUSEINPUT
事件。