【转】air调用windows自带的虚拟键盘

时间:2023-03-08 16:53:35

原文: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拷贝到任何地方使用。