Flash与Air点滴之 - Air系统进程管理
最近做一个项目,用于Windows平台,客户要求要让程序开启后自动全屏,并且不能退出,这样必须还要解决系统的关机与重启问题,需要在Air内部调用关机或重启命令。
第一个全屏是很简单的了。然而这里有一个问题就是全屏后还需要键盘交互和阻止Esc退出全屏的功能。这个我以前做网页的flash开发,无论如何实现不了,这个是flash本身考虑到安全问题限制的,网上找到的答案基本上都是,在air中可以做到。但是,我按照原来的方法测试,却仍然无法在全屏时接收键盘事件,当然更阻止不了Esc退出全屏。这个不是重点,直接说最终的解决办法吧:那就是Flash的StageDisplayState除了一个FULL_SCREEN和NORMAL外,还有一个FULL_SCREEN_INTERACTIVE,字面意思就是可交互全屏。官方说明:
public static const FULL_SCREEN_INTERACTIVE:String = "fullScreenInteractive" 语言版本: ActionScript 3.0 运行时版本: Flash Player 11.3, AIR 1.0, Flash Lite 4 指定舞台处于启用键盘交互性操作的全屏模式。从 Flash Player 11.3 起,AIR 应用程序和基于浏览器的应用程序都支持此功能。
好吧,好消息就是Flash Player 11.3起也支持该功能了,能不能阻止退出全屏是小事,能够支持全屏输入,这个很好了。
然后就是操作系统进程或者说调用外部程序。
遇到这种没用过的接口,我总是会第一时间查手册,这种接口可能存在的包就是Flash.system和Flash.desktop,但是很失败我没找到(其实是由于英文水平太差,而且没有认真看。)
第二步自然是问谷哥和百度了。
找到的解决方法是有一个as3Utils库,包含一些封装好的系统调用功能,包括
adobe air常用工具,用于方便的操作windows系统命令 已经实现的功能有: 1.关机、重启、计时关机、计时重启 2.操作注册表 3.将指定的可执行程序设为开机启动 4.移除开机启动程序 5.将指定的可执行文件注册为服务 6.移除指定名称的服务 7.启动服务 8.停止服务 9.截取屏幕 10.打开本机指定的文件及文件夹 11.隐藏窗口调用本机命令 12.显示窗口调用本机命令 13.延时执行命令(此功能可以用来做应用程序的重启等)
googleCode: airutils
这正是我想要的。下载后赶忙去测试。为了快速,直接在舞台上拖了两个按钮(),绑定点击事件:
import com.plter.air.windows.utils.ShutdownCommand; import fl.controls.Button; import flash.events.MouseEvent; var sdc:ShutdownCommand=new ShutdownCommand(); shutdown.addEventListener(MouseEvent.CLICK,function(){sdc.shutdown(60)}); cancel.addEventListener(MouseEvent.CLICK,function(){sdc.abort()});运行后点击出现错误:
Error: Error #3219: The NativeProcess could not be started. 'Not supported in current profile.' at Error$/throwError() at flash.desktop::NativeProcess/start() at com.plter.air.windows.utils::NativeCommand/Exec()[D:\svnroot\airutils\AirUtils\src\com\plter\air\windows\utils\NativeCommand.as:48] at com.plter.air.windows.utils::NativeCommand/runCmd()[D:\svnroot\airutils\AirUtils\src\com\plter\air\windows\utils\NativeCommand.as:60] at com.plter.air.windows.utils::ShutdownCommand/shutdown()[D:\svnroot\airutils\AirUtils\src\com\plter\air\windows\utils\ShutdownCommand.as:42] at Function/<anonymous>()[airTest_fla.MainTimeline::frame1:39]大概意思就是当前的配置文件不支持该操作。寻找错误源竟然是在flash.desktop下的NativeProcess,原来airutils是通过这个接口来实现的功能。
那么为什么会显示不支持呢?
NativeProcess文档页面部分说明:
语言版本: ActionScript 3.0 运行时版本: AIR 2 NativeProcess 类提供命令行集成和常规启动功能。NativeProcess 类允许 AIR 应用程序在主机操作系统上执行本机进程。AIR 应用程序可以监视进程的标准输入 (stdin) 和标准输出 (stdout) 流以及进程的标准错误 (stderr) 流。 NativeProcess 类及其功能只对使用本机安装程序安装的 AIR 应用程序(扩展桌面配置文件应用程序)可用。调试时,可将 -profile extendedDesktop 参数传递到 ADL 以启用 NativeProcess 功能。在运行时,您可以检查 NativeProcess.isSupported 属性以确定是否支持本机进程通信。
extendedDesktop自然是扩展桌面了,点击应用程序设置,配置下的扩展桌面也是勾选了的。
又经过网上搜罗,发现虽然配置那里全选了,但是文件对应的配置文件airTest-app.xml里面是没有supportedProfiles这个节点的,于是我勾选掉一个没用的选项,点击确定保存配置,再看配置文件
节点已经自动添加上了。
但是再次测试,依然同样的问题。于是把除了扩展桌面之外的全部取消,运行,OK!原来问题在这里!
点击关机会出现系统提示倒计时60s关机,再点击取消,系统提示取消,关机操作也同时取消。