您的位置:首页 > 编程语言 > C#

C# WindowsForms 与 Flash ActionScript 3 交互通讯

2016-12-23 00:00 597 查看

基本环境

C# Winform 使用 COM 组件 Shockwave Flash Object(需要安装 Adobe Flash Player ActiveX)

Flash 使用 flash.external.ExternalInterface 类、flash.system.fscommand 方法

基本原理

C# 所使用的 COM 组件,相当于一个运行 Flash 的播放器,也就是 Flash 的容器。该组件官方已经封装成一个 WindowsForms 控件,通过属性和方法可以直接控制播放器和 Flash 交互,非常易用。

Flash 则是通过标准库中的 flash.external.ExternalInterface 类,与容器交互通讯。或者使用 flash.system.fscommand 方法,发送“命令”给容器。(注意:当你使用控件播放 flash 时,原始播放器的所有命令都不可用,比如quit、fullscreen,命令变成触发 FSCommand 事件,可以自己进行处理)

参考官方手册 - 使用外部 API

通讯结构图





使用 COM 组件

VS工具箱-选择项-COM组件-浏览-"C:\Windows\System32\Macromed\Flash\Flash.ocx" 选择-"ShockwaveFlashObjects"

将 Flash 控件拖入窗体中,设置 Movie 属性指定要打开的 swf 文件



FSCommand

使用非常简单,直接调用方法

只能传递2个字符串参数

只能从 Flash 发送到 C#

示例代码,Flash 传入2个字符串参数,然后在 C# 弹出窗口显示出来。

ActionScript:

flash.system.fscommand("command", "args");

C#:

// 注册事件处理方法
this.flash.FSCommand += flash_FSCommand;
private void flash_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
{
MessageBox.Show($"{e.command}, {e.args}");
}

ExternalInterface

非常强大,但需要解析 xml

支持传递任意多参数

支持 null、Boolean、String、Number、int、uint、Array、Object 等类型

Flash -> C# 过程

Flash 调用 ExternalInterface.call(functionName:String, ...rest)

Flash环境自动将 functionName 和 args 转化为 Api-Xml,并发送到容器,触发事件 FlashCall

从事件参数 e.request 获取到 Api-Xml,自己进行解析处理。

示例代码,从 Flash 发送2个 String 类型参数到 C#,C# 弹出输出 Api-Xml

ActionScript:

ExternalInterface.call("SendString", "arg1", "arg2");

C#:

// 注册事件处理方法
this.flash.FlashCall += flash_FlashCall;
private void flash_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
{
MessageBox.Show(e.request);
}

C# -> Flash 过程

C# 调用 flash.CallFunction(string request) 发送 xml,request 是按照 Api-Xml 的格式生成的

Flash环境自动将 request 解析为 函数名 和 传入参数。

用户需要使用 ExternalInterface.addCallback(functionName:String, closure:Function) 注册回调函数

根据用户注册的回调函数(functionName相同),将 传入参数 传到回调函数并执行。如果参数不匹配,则会抛出错误。

示例代码,从 C# 发送2个 String 类型参数到 Flash

ActionScript:

// 注册回调函数啊
ExternalInterface.addCallback("SendString", SendString);
private function SendString(arg1:String, arg2:String)
{
trace(arg1, arg2);
}

C#:

string request = "<invoke name=\"SendString\" returntype=\"xml\"><arguments><string>name</string><string>age</string></arguments></invoke>";
flash.CallFunction(request);

Api-Xml

基本格式:

<invoke name="functionName" returntype="xml">
<arguments>
...
</arguments>
</invoke>
<!-- 示例 -->
<invoke name="functionName" returntype="xml">
<arguments>
<string>字符串值</string>
<number>27.5</number>
</arguments>
</invoke>

类型格式:

<!-- null -->
<null/>
<!-- Boolean -->
<true/>
<false/>
<!-- String -->
<string>字符串值</string>
<!-- Number、int、uint -->
<number>27.5</number>
<number>-12</number>
<!-- Array 对应 C# ArrayList -->
<array>
<property id="0">
<number>27.5</number>
</property>
<property id="1">
<string>Hello there!</string>
</property>
...
</array>
<!-- Object 对应 C# HashTable -->
<object>
<property id="name">
<string>John Doe</string>
</property>
<property id="age">
<string>33</string>
</property>
...
</object>

参考官方手册 - 使用 ExternalInterface 类

Flash 控件的使用说明

Movie:要播放的影片路径(URL )。设置该属性为 一个 SWF 文件的 URL 将载入文件并播放它。若影片是在 本地硬盘上,要写成从盘符开始的绝对路径;若影片是在 某网站上,也要写全 URL 地址。
示例:

movie.Movie = "http://www.domain.com/path1/path2/filename.swf";
movie.Movie = "C:\temp\test.swf";

更多信息参考:C#中使用Flash控件的相关知识

我的处理 Api-Xml 的 C# 工具类

我已经将 api-xml 转换和解析封装成一个工具类,非常方便易用,开源代码。

GitHub:FlashApiXmlHandler.cs

支持多参数,添加参数 Add() 支持链式调用

支持常见数值类型 int uint double

支持传递数组,即 ArrayList 和 flash.Array 互转。(C# 转换 Flash 支持 IList 接口类型,Flash 转回 C# 是 ArrayList 类型)

支持传递对象,即 Hashtable 和 flash.Object 互转。(C# 转换 Flash 支持 IDictionary 接口类型,Flash 转回 C# 是 Hashtable)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# Flash