等待出现已知的窗口中的其中一个,执行键盘命令,求解![已解决]
本帖最后由 pzh621 于 2010-3-9 19:41 编辑我有一个刷卡服务端,假定刷卡时总共会出现三个窗口,我需要等待这些窗口的出现,然后发送键盘命令,我的代码如下:
While 1
If WinWait("", "该卡已激活!", 1) Then Send("{Enter}")
If WinWait("", "该用户是否要下机?", 1) Then Send("{Esc}")
If WinWait("", "此卡非法,请勿使用!", 1) Then Send("{Esc}")
Wend
上边的代码循环运行,但每行代码都要等上边的超时,效率不高,每次的窗口都不相同,最重要的是这些窗口并不按顺序出现!我是个新学菜鸟,求高手优化一下上边的代码,谢谢! 本帖最后由 llztt 于 2010-3-9 17:39 编辑
别用winwait的第三个参数啊,那个当然等了。。
首先一个逻辑问题,什么条件下跳出这个循环??三个窗口都出现过了,才退出?还是压根儿你就不想退出一直循环他来?
用winexists来判断窗口出现,如果出现就winactivate然后controlcilck控件,这样保险,免得窗口失去激活你send enter失效。。我估计那3个窗口都是确定窗口都有按钮吧。。 我需要这个程序一直执行下去,不退出循环的,因为会有人一直刷卡;如果我不使用第三个超时参数, 那么上边的代码只能按顺序出现后才能继续,这样不是没起作用了?
另外就是如果使用controlcilck控件的话,我发现如果鼠标停留在程序上时,不起作用,而这个程序窗口挺大的,鼠标大部分时间都停留在上边了,所以我不使用这个,选择使用键盘命令! “如果我不使用第三个超时参数, 那么上边的代码只能按顺序出现后才能继续,这样不是没起作用了?”
呵呵,你怎么会这么想啊。。第一个窗口判断不存在,接着判断第二个,咦,存在,处理之,然后判断第三个窗口不存在,循环继续判断第一个窗口存在不。。。。哪个窗口出来就处理哪个,没出来窗口不会堵在那里。。
controlcilck使用前最好WINACTIVATE目标窗口,我想具体效果,你试试就知道了,我们没你那条件不好测试 本帖最后由 pzh621 于 2010-3-9 18:26 编辑
我不是很明白,我如果把等待超时去掉的话,他便一直在等待出现第一个窗口,然后发送键盘命令,这时如果出现的是第二个窗口却不处理,因为还在等待第一个窗口,所以我处理不好,希望你能把代码改好后发出来,,然后我去测试一下吗,谢谢! While 1
Select
Case WinExists("CLASS:#32770]", "该卡已激活!" )=1
WinActivate("")
SetError("{enter}")
Case WinExists("", "该用户是否要下机?") =1
WinActivate("")
SetError("{esc}")
Case WinExists("", "此卡非法,请勿使用!")=1
WinActivate("")
SetError("{esc}")
EndSelect
WEnd
未测试你自己测试吧 建议
1。窗口标题你再重新获取下,用那个估计不好用
2。不要用SEND 有controlclick
ControlClick
--------------------------------------------------------------------------------
向指定控件发送鼠标点击命令.
ControlClick ( "标题", "文本", 控件ID [, 按钮 [, 点击次数 [, X坐标 [, Y坐标 ]]]] )
参数
标题 目标窗口标题.
文本 目标窗口文本.
控件ID 要进行交互的控件. 参考 控件 的说明.
按钮 [可选参数] 要点击的按钮, 可以是"left"(左键), "right"(右键), "middle"(中键), "main"(主要), "menu"(菜单), "primary"(主键), "secondary"(次键). 默认为left(左键).
WinExists
--------------------------------------------------------------------------------
检查指定的窗口是否存在.
WinExists ( "窗口标题" [, "窗口文本"] )
参数
窗口标题 目标窗口标题.参考 标题特殊定义.
窗口文本 [可选参数] 要检查的窗口所包含的文本.
返回值
成功: 返回 1,窗口存在.
失败: 返回 0,窗口不存在. 回复 5# pzh621
用WINEXISTS,别用WINWAIT,像楼上给你的例子那样就好了 本帖最后由 pzh621 于 2010-3-9 22:34 编辑
While 1
Select
Case WinExists("", "该卡已激活!" )=1
WinActivate("", "该卡已激活!")
Send("{Enter}")
Case WinExists("", "该用户是否要下机?") =1
WinActivate("", "该用户是否要下机?")
Send("{Esc}")
Case WinExists("", "此卡非法,请勿使用")=1
WinActivate("", "此卡非法,请勿使用")
Send("{Esc}")
EndSelect
WEnd
谢谢楼上的两位热心的大哥,我把代码改为上边,问题解决了,在此还有一个疑问,希望能解答一下:
我尝试把命令:Send("{Esc}")
改为:ControlClick("", "该卡已激活!", "确定")
结果发现改后,如果鼠标指针停留在程序的大窗口上时,不能执行ControlClick点击"确定",非得把鼠标指针移到程序窗口之外,或“该卡已激活”的小窗口上方能生效 改为:ControlClick("", "该卡已激活!", "确定")
pzh621 发表于 2010-3-9 19:36 http://www.autoitx.com/images/common/back.gif
标题为什么留空呢? 标题为什么留空呢?
因为弹出的小窗口是没有标题的啊 本帖最后由 jybb001 于 2010-3-9 21:44 编辑
回复 11# pzh621
ControlClick判断点击的主要依据就是第一个参数,你留空了所以不能正常操作。
小窗口无标题你仍可以用类名效果应该是一样的,。
ControlClick("("", "该卡已激活!", "确定")
你试下吧
第一个参数一定不要留空,不然效果当然不能保证 谢谢啦,问题解决了,编绎成EXE后运行,发现CPU使用率高达50%,晕哦,请问有办法再优化吗? 回复 13# pzh621
循环里面插入个 sleep(1) :face (36):问题全部解决,谢谢afan 、jybb001 、llztt 等大大们热心的解答及帮助,终于完成了第一个AU3作品,呵呵!
页:
[1]