找回密码
 加入
搜索
查看: 5400|回复: 14

[AU3基础] 等待出现已知的窗口中的其中一个,执行键盘命令,求解![已解决]

  [复制链接]
发表于 2010-3-9 17:32:37 | 显示全部楼层 |阅读模式
本帖最后由 pzh621 于 2010-3-9 19:41 编辑

我有一个刷卡服务端,假定刷卡时总共会出现三个窗口,我需要等待这些窗口的出现,然后发送键盘命令,我的代码如下:

While 1
    If WinWait("[CLASS:#32770]", "该卡已激活!", 1) Then Send("{Enter}")
    If WinWait("[CLASS:#32770]", "该用户是否要下机?", 1) Then Send("{Esc}")
    If WinWait("[CLASS:#32770]", "此卡非法,请勿使用!", 1) Then Send("{Esc}")
Wend

上边的代码循环运行,但每行代码都要等上边的超时,效率不高,每次的窗口都不相同,最重要的是这些窗口并不按顺序出现!我是个新学菜鸟,求高手优化一下上边的代码,谢谢!

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-3-9 17:38:45 | 显示全部楼层
本帖最后由 llztt 于 2010-3-9 17:39 编辑

别用winwait的第三个参数啊,那个当然等了。。
首先一个逻辑问题,什么条件下跳出这个循环??三个窗口都出现过了,才退出?还是压根儿你就不想退出一直循环他来?

用winexists来判断窗口出现,如果出现就winactivate然后controlcilck控件,这样保险,免得窗口失去激活你send enter失效。。我估计那3个窗口都是确定窗口都有按钮吧。。

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-3-9 17:51:54 | 显示全部楼层
我需要这个程序一直执行下去,不退出循环的,因为会有人一直刷卡;如果我不使用第三个超时参数, 那么上边的代码只能按顺序出现后才能继续,这样不是没起作用了?

另外就是如果使用controlcilck控件的话,我发现如果鼠标停留在程序上时,不起作用,而这个程序窗口挺大的,鼠标大部分时间都停留在上边了,所以我不使用这个,选择使用键盘命令!
发表于 2010-3-9 17:57:01 | 显示全部楼层
“如果我不使用第三个超时参数, 那么上边的代码只能按顺序出现后才能继续,这样不是没起作用了?”
呵呵,你怎么会这么想啊。。第一个窗口判断不存在,接着判断第二个,咦,存在,处理之,然后判断第三个窗口不存在,循环继续判断第一个窗口存在不。。。。哪个窗口出来就处理哪个,没出来窗口不会堵在那里。。
controlcilck使用前最好WINACTIVATE目标窗口,我想具体效果,你试试就知道了,我们没你那条件不好测试
 楼主| 发表于 2010-3-9 18:05:29 | 显示全部楼层
本帖最后由 pzh621 于 2010-3-9 18:26 编辑

我不是很明白,我如果把等待超时去掉的话,他便一直在等待出现第一个窗口,然后发送键盘命令,这时如果出现的是第二个窗口却不处理,因为还在等待第一个窗口,所以我处理不好,希望你能把代码改好后发出来,,然后我去测试一下吗,谢谢!
发表于 2010-3-9 18:25:23 | 显示全部楼层
While 1
        Select 
                Case WinExists("CLASS:#32770]", "该卡已激活!" )=1
                        WinActivate("[CLASS:#32770]")
                        SetError("{enter}")
                Case WinExists("[CLASS:#32770]", "该用户是否要下机?") =1
                        WinActivate("[CLASS:#32770]")
                        SetError("{esc}")
                Case WinExists("[CLASS:#32770]", "此卡非法,请勿使用!")=1
                        WinActivate("[CLASS:#32770]")
                        SetError("{esc}")
        EndSelect
WEnd
未测试你自己测试吧

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-3-9 18:28:16 | 显示全部楼层
建议
1。窗口标题你再重新获取下,用那个估计不好用
2。不要用SEND 有controlclick

ControlClick
--------------------------------------------------------------------------------

向指定控件发送鼠标点击命令.


ControlClick ( "标题", "文本", 控件ID [, 按钮 [, 点击次数 [, X坐标 [, Y坐标 ]]]] )




参数

标题 目标窗口标题.
文本 目标窗口文本.
控件ID 要进行交互的控件. 参考 控件 的说明.
按钮 [可选参数] 要点击的按钮, 可以是"left"(左键), "right"(右键), "middle"(中键), "main"(主要), "menu"(菜单), "primary"(主键), "secondary"(次键). 默认为left(左键).


WinExists
--------------------------------------------------------------------------------

检查指定的窗口是否存在.


WinExists ( "窗口标题" [, "窗口文本"] )




参数

窗口标题 目标窗口标题.参考 标题特殊定义.
窗口文本 [可选参数] 要检查的窗口所包含的文本.



返回值

成功: 返回 1,窗口存在.
失败: 返回 0,窗口不存在.
发表于 2010-3-9 18:31:17 | 显示全部楼层
回复 5# pzh621

用WINEXISTS,别用WINWAIT,像楼上给你的例子那样就好了
 楼主| 发表于 2010-3-9 19:36:34 | 显示全部楼层
本帖最后由 pzh621 于 2010-3-9 22:34 编辑
While 1
        Select 
                Case WinExists("[CLASS:#32770]", "该卡已激活!" )=1
                       WinActivate("[CLASS:#32770]", "该卡已激活!")
                               Send("{Enter}")
                Case WinExists("[CLASS:#32770]", "该用户是否要下机?") =1
                               WinActivate("[CLASS:#32770]", "该用户是否要下机?")
                               Send("{Esc}")
                Case WinExists("[CLASS:#32770]", "此卡非法,请勿使用")=1
                               WinActivate("[CLASS:#32770]", "此卡非法,请勿使用")
                               Send("{Esc}")
        EndSelect
WEnd
谢谢楼上的两位热心的大哥,我把代码改为上边,问题解决了,在此还有一个疑问,希望能解答一下:

我尝试把命令:Send("{Esc}")
改为:ControlClick("", "该卡已激活!", "确定")
结果发现改后,如果鼠标指针停留在程序的大窗口上时,不能执行ControlClick点击"确定",非得把鼠标指针移到程序窗口之外,或“该卡已激活”的小窗口上方能生效
发表于 2010-3-9 20:02:26 | 显示全部楼层
改为:ControlClick("", "该卡已激活!", "确定")

pzh621 发表于 2010-3-9 19:36


标题为什么留空呢?
 楼主| 发表于 2010-3-9 20:59:33 | 显示全部楼层
标题为什么留空呢?

因为弹出的小窗口是没有标题的啊
发表于 2010-3-9 21:43:08 | 显示全部楼层
本帖最后由 jybb001 于 2010-3-9 21:44 编辑

回复 11# pzh621


ControlClick判断点击的主要依据就是第一个参数,你留空了所以不能正常操作。
小窗口无标题你仍可以用类名效果应该是一样的,。
ControlClick("("[CLASS:#32770]", "该卡已激活!", "确定")
你试下吧
第一个参数一定不要留空,不然效果当然不能保证
 楼主| 发表于 2010-3-9 22:48:34 | 显示全部楼层
谢谢啦,问题解决了,编绎成EXE后运行,发现CPU使用率高达50%,晕哦,请问有办法再优化吗?
发表于 2010-3-9 22:53:01 | 显示全部楼层
回复 13# pzh621


    循环里面插入个 sleep(1)
 楼主| 发表于 2010-3-9 23:03:58 | 显示全部楼层
问题全部解决,谢谢afan 、jybb001 、llztt 等大大们热心的解答及帮助,终于完成了第一个AU3作品,呵呵!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 10:12 , Processed in 0.086500 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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