|
本帖最后由 我是MT 于 2015-10-25 04:37 编辑
用到的相关技术:C#找图识图,模拟鼠标键盘的点击操作。
应用场景和问题描述:我做了一个软件,有这样一个应用场景:就是C#模拟鼠标右键点击桌面【我的电脑】→【计算机】图标,弹出来菜单栏,菜单栏中有“【打开】”这个选项(如下图),我接着通过找图的方法寻找“【打开】”这个图片(如下图第二张图),找到这个位置之后,鼠标移动到这个选项位置上,进行点击操作。由于考虑到每个人的电脑配置不同,而且我这个操作对于效率有较高的要求。如何能够保证这一连串动作以最快的效率完成。
注:我找图的原理,就是在屏幕上面寻找我事先已经准备好的图片。来通过图片,定位这些“菜单项”的位置。
首先是在桌面上寻找图片“我的电脑”,找到之后,鼠标右键。这个时候会弹出来菜单。电脑配置很慢的情况下, 右键弹出来菜单的响应时间,有的可能是100ms,有的速度快得可能是20ms。有的可能要200ms。为了能够兼容所有的机器,我这里索性把这个等待的时间,设置成了300ms。300ms 之后再去判断,右键是否弹出来了这个菜单。所以300ms之后会扫描一次,是否出来了菜单栏。但,因为需要频繁进行判断,所以每次判断至少要300ms时间。导致鼠标模拟操作的动作很不连贯,停顿和浪费的时间非常多。
我的意思是,有没有办法加快这个过程。比如采用异步方法无限死循环找图,一旦捕获到右键菜单一弹出来,就进行相应的鼠标点击操作。这样子就不必每次等待的时间设置为固定死的300ms,导致每个动作都有很大的停顿感。也就是采用自定义事件的方式,替代这种固定延时300ms的笨笨的做法。灵活地判断图片什么时候出来了,立即进行相应的响应。做到快速响应。
如果是自定义无限循环找图,把死循环放到自定义事件里面。会导致界面卡顿。有没有更好的办法,即达到我的目的,又不导致界面卡顿的办法呢。
当然,我上面这个应用场景只是举个例子。高手们不要疑问,为何我要有这样一个应用场景,并且为何一定要用找图识图的方法来判断菜单栏是否出现。因为我这个应用场景比较特殊,所以为了能够说明问题,我就拿这个来举个例子而已。
因为是部署在配置很低的台式机上面,各种机器的配置不尽相同。运行速度也不一致。有快有慢。所以在执行很多动作的时候,为了能够在菜单弹出来之后,做出正确的判断。所以统一延时了300ms。这种一刀切的办法,导致,当你的操作步骤有很多的时候,这个延时叠加起来就显得非常低效率。而且固定的延时300ms,也没有充分利用每台机器的cpu效率。
|
|