原文:http://bbs.9ria.com/blog-73243-19560.html
最近在做一个东西,需要用到虚拟键盘。刚开始准备用as3开发一套,结果突然想起来windows有个自带的虚拟键盘(osk.exe),而且air是支持调用本地程序的,所以就写了个程序来调用。刚开始直接调用C:/Windows/System32/osk.exe 发现是行不通的,调用的时候会报错。而后想了下,或许osk.exe这个东西更应该是属于bat类型文件,而NativeProcess是不能直接调用bat文件的,要用的话需要先调用cmd,然后给cmd参数来调用osk。试了下,果然行了。
先上代码
package { importflash.desktop.NativeApplication; importflash.desktop.NativeProcess; importflash.desktop.NativeProcessStartupInfo; import flash.display.Sprite; importflash.display.StageDisplayState; import flash.events.Event; import flash.events.MouseEvent; import flash.filesystem.File; import flash.text.TextField; importflash.text.TextFieldType; public class VirtualKeyBoard extendsSprite { private varfile:File; private varnativeProcessStartupInfo:NativeProcessStartupInfo; private varprocess:NativeProcess; private vartextField:TextField; public functionVirtualKeyBoard() { this.stage.displayState =StageDisplayState.FULL_SCREEN_INTERACTIVE; this.stage.nativeWindow.alwaysInFront = true; process =new NativeProcess(); file = newFile(); NativeApplication.nativeApplication.autoExit=true; file=file.resolvePath("C:/Windows/System32/cmd.exe"); varprocessArg:Vector. = new Vector.(); processArg[0] = "/c";// 加上/c,表示是cmd的参数 processArg[1] ="C:/Windows/System32/osk.exe";//bat的路径,建议用绝对路径,如果是相对的,可以用File转一下 nativeProcessStartupInfo = newNativeProcessStartupInfo(); nativeProcessStartupInfo.executable = file; nativeProcessStartupInfo.arguments = processArg; textField= new TextField(); textField.width = 300; textField.y = 30; textField.x = 30; addChild(textField); textField.border = true; textField.type = TextFieldType.INPUT; textField.addEventListener(MouseEvent.CLICK,onTextFieldActivateHandler); } private functiononTextFieldActivateHandler(evt:Event):void { if(process.running)return; process.start(nativeProcessStartupInfo); } } }
注意下中间
processArg[0] = "/c";// 加上/c,表示是cmd的参数
processArg[1] ="C:/Windows/System32/osk.exe";//bat的路径,建议用绝对路径,如果是相对的,可以用File转一下
这两行代码就行,是给调用的程序添加参数。
另外,可以把osk.exe拷贝到任何地方使用。