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)
相关文章推荐
- javascript和Flash ActionScript的交互(AS3)
- C# 的时间戳 在flash actionscript中使用
- 积少成多Flash ActionScript 3.0(7) - 交互之鼠标事件和键盘事件
- C#与Flash ActionScript 2.0通过xml操作数据库(一)
- 积少成多Flash ActionScript 3.0(7) - 交互之鼠标事件和键盘事件
- C# 的时间戳 在flash actionscript中使用
- C#与Flash ActionScript 2.0通过xml操作数据库(二)
- 关于Flash Actionscript脚本与HTML页面JavaScript脚本通讯的方法
- JavaScript与C# Windows应用程序交互(转)
- 释Flash ActionScript代码优化原则
- JavaScript与C# Windows应用程序交互
- ( Flash ActionScript)SharedObject类_01
- Windows Forms Programming In C# 读书笔记 - 第四章 Drawing Basics
- JavaScript与C# Windows应用程序交互
- JavaScript与C# Windows应用程序交互方法
- 编程笔记:Windows Forms in C#
- Flash Actionscript 2.0 在 FMS 中检测麦克风 摄像头状态的类
- flash action script 制作线条
- Flash ActionScript 中按钮和电影剪辑的事件和方法
- Flash Action Script总结【非此即彼问题】