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关机,再点击取消,系统提示取消,关机操作也同时取消。