(转)FScommand()兑现与外部程序的信息交互

(转)FScommand()实现与外部程序的信息交互
FScommand()实现与外部程序的信息交互
作为制作课堂教学课件的三大主流程序(PowerPoint, Authorware和Flash)之一的Flash,它是公认的制作高品质的课件的首选。而Flash的ActionScript(动作脚本语言)则是Flash制作的灵魂和精髓。可以毫不夸张地说,不会ActionScript的人,就是不懂得Flash。
FScommand()命令是Flash用来和支持它的其他应用程序互相传达命令的工具。我在这里通过几个例子来说明FScommand()命令的常用的方法。

一. 控制Flash影片(swf)或Flash播放器(exe)的播放
FScommand()命令的使用方法是:FScommand(command,argument)
Command是命令字符串;argument是参数字符串。
Command命令字符串可以是:
“Quit”             退出播放
“FullScreen”       是否全屏播放
“Exec”             运行指定的程序或调用函数
“Show Menu”        显示播放器菜单

先来个简单的,在Flash的时间轴中,选中第一帧,打开“动作”面板(或按F9),在面板的编辑区中输入代码:
fscommand("fullScreen", true);
再导出影片。运行影片文件时,你会发现,影片以全屏的方式播放!

二. 利用中间程序运行其他程序并传递参数
FScommand()的Exce命令,会让影片文件或播放器运行其他的程序或调用IE中的函数。

在Flash 3、4、5版本中,调用exce命令是非常方便的。用法是
fscommand("exce",程序名+空格+文件名);  //用某种程序打开某个文件
程序名和文件名的前面可以加上绝对路径或相对路径,这样它就能以命令行的方式来打开所有的文件。这也成了黑客入侵的方便途径。
而在Flash 6、7、8版本中,Flash增强了它的安全性,对exce命令的使用作了限制:其他的程序必须在播放器中(exe)才能才能运行,在Flash影片(swf)中是无法运行的;需要调用的程序必须在播放器所在的文件夹的FScommand子文件夹中;而且argument参数字符串只能是程序名,不能带路径,不能带文件名,也就是fscommand("exce",程序名)
这样,用exce就只能打开程序,而无法直接打开文件。难道就没有别的办法把文件名作为参数传给程序?
在这里,我举一个例子,按动Flash播放器(exe)中的一个按钮,用wplayer2.exe播放beijing.avi影片。
原理: 我们可以在Flash中,把命令行以字符串的形式传入系统剪贴板中(“wplayer2.exe beijing.avi”),然后调用自己编写一个中间程序fOpen.exe,利用fOpen.exe程序调动mplayer2.exe播放beijing.avi影片。
关于fOpen.exe程序,这是一个用VB编写的程序,这需要有一点点VB的编程知识。程序运行时,自动读取系统剪贴板中的文字(即命令行),然后启动命令行(“shell 程序及参数,窗口状态”))。程序将运行剪贴板中的命令行。


注意在制作时要先写中间程序,后写Flash播放器(exe),具体过程是:1。建一个文件夹myflash,在该文件夹中建子文件夹fscommand。  2。把C:\Program Files\Windows Media Player\mplayer2.exe复制到fscommand文件夹中,把要播放的影片beijing.avi也复制进来。 3。启动VB 6.0,新建一个工程,在窗体代码中粘贴代码,并在fscommand文件夹中生成fOpen.exe。 4。启动Flash MX 2004,在场景中添加一个按钮,选中按钮,打开动作面板,粘贴脚本代码。 5。在myflash文件夹中生成Flash播放器(exe)。生成播放器有两种方法:一种是按“文件——发布设置”,在打开的发布设置面板中,去掉默认的Flash和HTML前的选择,改选windows放映文件前打钩,然后按“文件——发布”就会在Flash保存的文件夹中生成一个同名的Flash播放器(exe),当然,你要事先把Flash保存在myflash文件夹中。另一种方法是,先在myflash文件夹中生成Flash影片(swf),然后打开Flash影片(swf),按“文件——创建播放器”也能生成Flash播放器(exe)。这样,打开Flash播放器(exe),按Flash播放器(exe)中的按钮,就能启动wplayer2.exe播放beijing.avi影片。

VB程序fOpen的代码:
Private Sub Form_Load()
On Error GoTo OpenErr  '发生错误后,程序结束
  Dim txtstr As String '定义变量
  If App.PrevInstance Then End  '为防止运行时出现混乱,所以只允许运行一个实例
  txtstr = Clipboard.GetText   '把剪贴板的数据储存在一个名为FilNam的变量里.
  Clipboard.Clear '清空剪贴板
 
  Shell App.Path & "\" & txtstr, vbNormalFocus
  End
OpenErr:
  End
End Sub

Flash中按钮代码:
on(press){
strval=fname+":varstr="+inputstr
System.setClipboard(strval)  //这句话用于将命令行字符串传到剪贴板,
    fscommand ("exec", "fOpen.exe"); //剪贴板获得数据后,可以打开fOpen.exe, //让该程序来获取剪贴板数据,并运行命令行
}

三. 利用VB程序写文件
我再举一个例子,按动Flash播放器(exe)中的一个按钮,调用一个自编的VB程序writetextfile.exe,利用writetextfile.exe程序中的“open 文件名 For Binary As #1”的语句,以二进制的方式,写文本文件。
运行的原理和上个例子差不多,我就几点不同作一下说明:
1.在场景的帧动作面板(在时间轴面板中选择第一帧,打开动作面板)中输入代码:
system.useCodepage=true;
stop()



为什么要这样呢?原来,system.useCodepage 的默认值是False,这就是说Flash采用Unicode的编码来处理字符信息,而操作系统默认则采用ANSI的编码来处理(如“记事本”的默认编码就是ANSI)。这也是我们用“loadVariables("text.txt","")”来读取文本文件中的内容时(内容一般是:字符型变量名=字符串),如果变量值的字符串中含有中文字符时会出现乱码的原因。因此,你在Flash中输入或输出字符串时,就要写上system.useCodepage=true的代码。
2.注意要传入系统剪贴板中的、供writetextfile.exe调用的信息,要经过串格化处理。

附Flash按钮代码:
on(press){
fname="c2k20.txt"
strval=fname+":varstr=大家好!"
//剪贴板中的内容为:文件名 + ":" + 文件内容
  //由于文件内容要供FLASH导入使用,注意要使用  变量名 = 变量值   的形式

System.setClipboard(strval)  //这句话用于将文件名的数据传到剪贴板,
    fscommand ("exec", "writetextfile.exe"); //剪贴板获得数据后,可以打开writetextfile.exe了,让该程序来获取剪贴板数据,并写文件
}
VB程序代码:
Private Sub Form_Load()
On Error GoTo OpenErr  '发生错误后,程序结束
  Dim txtstr As String '定义变量
  Dim temps() As String
  If App.PrevInstance Then End  '为防止运行时出现混乱,所以只允许运行一个实例
  txtstr = Clipboard.GetText   '把剪贴板的数据储存在一个名为FilNam的变量里.
  Clipboard.Clear '清空剪贴板
 
  '剪贴板中的内容为:文件名 + ":" + 文件内容
  '由于文件内容要供FLASH导入使用,注意要使用  变量名 = 变量值   的形式
  temps = Split(txtstr, ":")
  Open App.Path & "\" & temps(0) For Binary As #1
  Put #1, , temps(1)
  Close #1
  End
OpenErr:
  End
End Sub

四. 与IE进行信息交互
在上面举的例子中,我们利用的是自编的程序来完成预定的操作,这需要有一定的编程知识,并且你的计算机中要安装有像VB6.0之类的编程软件。有没有更简单的办法呢?有!那就是利用IE来进行信息交流及文件操作。


要利用IE进行信息交互,就要把Flash影片(swf)嵌入到HTML网页文件中,要用时,再双击HTML文件,在IE中播放Flash影片(swf),并进行信息从Flash到IE、或从IE到Flash的传递。HTML网页文件的编写可以用专用的网页编写软件如FrontPage或Dreamweaver等,也可以用“记事本”编写,然后在保存时,选择保存的文件类型为“*.*”,然后在保存文件名中输入带后缀名的文件名(文件名.html),再保存即可。(注意在嵌入Flash影片(swf)时需要注明版本号,这里所用的Flash MX 2004的版本号为6,0,29,0;在使用Flash MX 2004导出影片时要选择“Flash player 7”,“动作脚本2.0”)
我仍以上面举的点击Flash影片(swf)中的按钮,在磁盘写文件为例(文件名为“c2k20.txt”文件内容为“varstr=大家好!”),来说明何如何把信息从Flash传给IE,并在IE中利用JavaScript进行写文件的操作。
Flash中按钮的动作:
on(press){
fscommand ("c2k20.txt ", " varstr=大家好!");
}

Player.html网页文件的代码:(用记事本编写)
<HTML>
<HEAD>
<TITLE>player</TITLE>
<SCRIPT LANGUAGE=JavaScript>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
//从Flash导入的参数,command是要保存的文件名,args是要保存的文件内容
function myFlash_DoFSCommand(command, args) {
  var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  tf = fso.CreateTextFile("E:\\" + command, true);
  tf.WriteLine(args) ;
  tf.Close();
  alert ("成功保存" + command + "文件!");
}
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
  navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
  document.write('<SCRIPT LANGUAGE=VBScript\> \n');
  document.write('on error resume next \n');
  document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
  document.write(' call myFlash_DoFSCommand(command, args)\n');
  document.write('end sub\n');
  document.write('</SCRIPT\> \n');
}
//-->
</SCRIPT>



</HEAD>
<BODY>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="550" height="400" id="myFlash">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="player.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="player.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="myFlash" swLiveConnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
代码说明:JavaScript中的函数名称为myFlash_DoFSCommand,myFlash是嵌入的Flash影片(swf)的名字,它和<object>中的id,<embed>中的name的值要相一致。DoFSCommand则是Flash影片(swf)与JavaScript信息交互的标志。还有一点,由于JavaScript中的文件操作对象需要的文件名的实际的,完整的文件名,因此,我把文件保存在E盘的根目录下。

操作过程:1在myflash文件夹中建立Flash文件,并生成Player.swf影片文件;2仍在myflash文件夹中用记事本编写Player.html文件;3双击Player.html文件,用IE运行Player.html文件,如果IE的运行ActiveX的限制未打开,会出现警告,则取消限制,运行ActiveX。4点击Flash中的按钮,即可保存文件E:\c2k20.txt。

五. 从IE到Flash传递信息
从上一个例子中,我们已经实现了从Flash到IE的信息传递,大家如果有兴趣,可以了解一下从IE到Flash传递信息的方法。
1.我们可以在Flash文件中添加一个动态文本框,选中动态文本框,在“属性”面板中,设置变量名为myval。重新生成Player.swf。
2.接下来在Player.html网页文件<body>中加上一个表单,在表单中放一个输入文本框。(代码如下,放在<body>与</body>之间,且放在<object>与</object>之后:)
<p>
<form name="form1" onSubmit="doPassVar(sendText);" action="#">
  <input type="text" name="sendText" maxlength="45" onChange="doPassVar(this);">
</form>

写JavaScript函数:(放在<SCRIPT>与</SCRIPT>之间,且放在函数function myFlash_DoFSCommand(command, args){   }之后)
function doPassVar(args){
var sendText = args.value;

window.document.myFlash.SetVariable("myval", sendText);
    //要导入到Flash的参数,“myval”是swf文件中接收的变量名,sendText是值
}
3.双击player.html文件,在IE中,在Flash影片(swf)下的输入文本框中输入一些文字,如“Hello,大家好!”,点击文本框外的其他部分,会看到Flash影片(swf)中的动态文本显示为“Hello,大家好!”