Board logo

标题: 如何调用 Windows 图形界面应用程序及模拟按键(已解决) [打印本页]

作者: kafen     时间: 2006-12-17 00:25    标题: 如何调用 Windows 图形界面应用程序及模拟按键(已解决)

有个 Windows 图形界面应用程序打开后可以填入一个任意数字,然后点击确定即可,我想写个批处理来调用打开它并能填入指定的数字再自动完成确定,请问如何写这个批处理?多谢啦!

[ Last edited by kafen on 2006-12-19 at 09:54 PM ]
作者: redtek     时间: 2006-12-17 00:31
如果是命令行工具,兄可以参考如下两个贴子中的示例代码~:)



如何用管道的命令把多个结果输入到后一个程序里
http://www.cn-dos.net/forum/viewthread.php?tid=25707&fpage=2


如何用debug 编出一个回车的命令?
http://www.cn-dos.net/forum/viewthread.php?tid=25691&fpage=2




如果是调用 Windows 图形界面应用程序并发送数字以及模拟按键,则参考:


在CMD下如何用批处理模拟按键 (下面链接的第7楼示例代码)
http://www.cn-dos.net/forum/view ... p;highlight=sendkey


谁能帮忙编个VBS做一件不可能的事 (见贴子第5楼通过剪辑板实现发送信息)
http://www.cn-dos.net/forum/view ... p;highlight=sendkey

[ Last edited by redtek on 2006-12-16 at 11:37 AM ]
作者: jmz573515     时间: 2006-12-17 00:55
set ws=wscript.createobject("wscript.shell")
ws.run "calc.exe" '这是你要运行的程序,写上完整路径。
wscript.sleep 2000
ws.sendkeys "12321" '这里是你要填入的数字。
ws.sendkeys "~"
作者: kafen     时间: 2006-12-17 01:09


  Quote:
Originally posted by redtek at 2006-12-17 00:31:
如果是命令行工具,兄可以参考如下两个贴子中的示例代码~:)



如何用管道的命令把多个结果输入到后一个程序里
[url]http://www.cn-dos.net/ ...

@echo off
echo set WshShell = CreateObject("WScript.Shell") >>sendkey.vbs
echo WshShell.AppActivate %1 >>sendkey.vbs
echo WshShell.SendKeys "%2"       >>sendkey.vbs
:other
if "%3" == "" start sendkey.vbs & exit
echo WshShell.SendKeys "%3"       >>sendkey.vbs
shift
goto other
参数一:要发送按键的程序的标题,注意用引号括起来。
参数2-9:要发送的按键。可以发送一些功能键,如ALT,ESC,CTRL等等。。。

因是新手,故对于下面的解释有点看不懂,能否具体以实例解说一下,多谢了!
作者: redtek     时间: 2006-12-17 01:24
3楼jmz573515兄给出的示例代码非常详细易懂~:)
下面就把jmz573515兄给出的代码解释一下:
set ws=wscript.createobject("wscript.shell")
ws.run "calc.exe" '这是你要运行的程序,写上完整路径。

'    上面这句是运行一个要接收你发送键值的应用程序。上面是启动windows计算器。


wscript.sleep 2000

'    上面是延时(就是等待)2秒钟。那个2000是指毫秒-1秒等于1000毫秒。


ws.sendkeys "12321" '这里是你要填入的数字。

'    上面 ws.SendKey 是发送模拟按键的指令,发送12321这串数字到计算器中。
'    同样也可以发送模拟的按键,如回车等……

ws.sendkeys "~"
兄可以将3楼代码存成一个名为  计算器.VBS  的文件,然后鼠标双击执行。

另:兄5楼所提及代码先不要试验,那是用批处理将VBS代码写成VBS脚本。
  所以里面又包含了批处理文件操作技巧,反而又增加了学习难度。

建议只试验3楼代码,先从Windows计算器开始,然后再试着记事本,再试着其它更复杂应用程序的控制。


下面是VBS所能发送的健值代码举例:

(下面键值列表的部分内容取自互联网某网站,原作者不详)

  Quote:
对于SendKeys这个命令可以send什么,我们可以看下面的列表:

BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL or DELETE {DELETE} or {DEL}
DOWN ARROW {DOWN}
END {END}
ENTER {ENTER}or ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS or INSERT {INSERT} or {INS}
LEFT ARROW {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC}
RIGHT ARROW {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
UP ARROW {UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}

SHIFT +
CTRL ^
ALT %


作者: kafen     时间: 2006-12-17 01:36
多谢楼上两位,试用计算器和记事本成功,接下来再多试试别的,多谢了,我得好好学学啦!
作者: kafen     时间: 2006-12-17 02:06
可能是涉及到这个应用程序要指定输入框定位问题,还是无法实现,请帮我看看吧。

[ Last edited by kafen on 2006-12-17 at 02:43 AM ]
作者: wydos     时间: 2006-12-17 02:23
可以用tab键定位指定输入框,按下tab键,看按几下定位到你要的输入框
下面代码是 按tab键按6次
wshshell.sendkeys("{TAB 6}")
作者: kafen     时间: 2006-12-17 02:32


  Quote:
Originally posted by wydos at 2006-12-17 02:23:
可以用tab键定位指定输入框,按下tab键,看按几下定位到你要的输入框
下面代码是 按tab键按6次
wshshell.sendkeys("{TAB 6}")

真的好感谢大家,这里高手真多呀!
因为我上面是用ws.sendkeys,所以这里只能用ws.sendkeys("{TAB 6}"),否则会出现错误提示:找不到wshshell对象。谢谢你的指导!


因为大家的耐心指导,我已解决了问题,感谢jmz573515兄和wydos兄,特别是redtek兄的悉心指导!

set ws=wscript.createobject("wscript.shell")
ws.run "tcpPatch.exe" '这是你要运行的程序,写上完整路径。
wscript.sleep 2000 '这里设置延时时间为2秒钟。
ws.sendkeys("{TAB 1}")  '按一下TAB键定位鼠标位置,以此类推!
ws.sendkeys "300" '这里是你要填入的数字。
ws.sendkeys("{TAB 2}")  '再按两下TAB键定位应用按钮。
ws.sendkeys "~"  '按回车确定应用。
ws.sendkeys("{ESC}") '按ESC退出该程序。

[ Last edited by kafen on 2006-12-17 at 02:51 AM ]
作者: redtek     时间: 2006-12-17 02:46
set ws=wscript.createobject("wscript.shell")

上面的 set ws= 大概含义是:将创建的 "wscript.shell” 对象的 引用 赋给变量 ws

所以,你下面就可以引用这个对象来操作一些东东了:)

ws.run "calc.exe"

如果你将变量设置为 set redtek= …………
那么下面就当然是使用 redtek.run …… 什么了:)


(注: 上面我解释的不完全正确,没学过VBS,大概是这个意思,更详细兄再多查些更准确的解释与资料)
作者: kafen     时间: 2006-12-19 09:51
我晕,为什么以上的方法在做Flash Player 9.0 for IE批处理安装时无法实现?
Flash Player 9.0 for IE下载地址为:http://nj.onlinedown.net/soft/14968.htm

大家帮我看看好吗?谢谢了!


这是这样写的:
set ws=wscript.createobject("wscript.shell")
ws.run "flashIE.exe"
wscript.sleep 1000
ws.sendkeys "~"


存为.vbs文件后运行,安装完无法关闭界面!

[ Last edited by kafen on 2006-12-19 at 09:54 AM ]
作者: electronixtar     时间: 2006-12-19 11:07
1. 下载我提取的文件
2. 把它复制到 system32\ 文件夹
3. 运行 regsvr32 Flash9b.ocx

代码
copy /y Flash9b.ocx "%windir%\system32\"
regsvr32 Flash9b.ocx

作者: kafen     时间: 2006-12-19 11:21


  Quote:
Originally posted by electronixtar at 2006-12-19 11:07:
1. 下载我提取的文件
2. 把它复制到 system32\ 文件夹
3. 运行 regsvr32 Flash9b.ocx
...

谢谢回复,但是我试了,提示错误。我看到别人有个VBS转成的EXE,只是不知他加了什么代码可以安装完退出。我写的那个代码应当跟他差不多,就只是哪里差了一点。
哦,忘记了说一下,我不是在DOS下运行这些的。

[ Last edited by kafen on 2006-12-19 at 11:24 AM ]
作者: redtek     时间: 2006-12-19 11:42
不知道kafen兄试验时所提示的是什么错误?(这个有可能对解决这问题很关键)

如果安装程序都装完了但它自己不会退出(或是无法正常被.sendkey发送的退出等按键所控置),
如果是这样,干脆把那个安装程序用 TaskList 查出来,再用 TaskKill 杀掉~:)
作者: lisiyuan     时间: 2006-12-19 11:59
yun晕  看不懂  以后要努力学习了
作者: kafen     时间: 2006-12-19 21:37
可能是因为应用程序的动态窗口造成Sendkeys模拟按键的无法执行,请哪位高位知道如何解决?
作者: kafen     时间: 2006-12-19 21:41


  Quote:
Originally posted by redtek at 2006-12-19 11:42:
不知道kafen兄试验时所提示的是什么错误?(这个有可能对解决这问题很关键)

如果安装程序都装完了但它自己不会退出(或是无法正常被.sendkey发頮..

提示:Flash9b.ocx中的dllregisterserver失败,返回代码是:0X80004005
作者: kafen     时间: 2006-12-19 22:02
呵呵,开心,昨晚躺在床上终于让我想通了,原来我写的并没有错,只是设置的延时太短了,只要加长延时就可以了!

set ws=wscript.createobject("wscript.shell")
ws.run "flashie.exe"
wscript.sleep 5000
Ws.Sendkeys "~"

延时设为5000就解决了!谢谢楼上各位朋友的热心帮助!
作者: a9319751     时间: 2006-12-20 06:25
不错,学习
作者: redtek     时间: 2007-1-31 07:01
跟a9319751兄一起学习~:)