c# winform程序里嵌入FLASH

本文介绍如何在C# WinForm程序中嵌入Flash,并实现C#与Flash之间的通信。涉及控件添加、FSCommand事件处理及Flash Player 8 外部API使用等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------------------flash c#嵌入-------------------------------------- 

要在c# winform程序里嵌入FLASH,其实就是直接引用Flash的ocx控件。

那你就需要使用“COM 组件” Shockwave Flash Object。不过这个"Flash.ocx"控件不能直接在“COM 组件”窗口中找到.。

需要我们手动添加,选择菜单中的“工具”--“自定义工具箱”,打开“自定义工具箱”窗口,在“COM 组件”中点击“浏览”键,然后选择“c:/WINNT(WINDOWS)/system32/Macromed/Flash/swflash.ocx"控件,确定后在工具箱中就可以看到“FlashFactory”,“ShockwaveFlash”两个新控件

添加控件注意

我使用的是“xp系统”和FLASH8与flash9都有安装,ShockwaveFlash就是在“C:/WINDOWS/system32/Macromed/Flash/”目录下面(我使用的“Flash9d.ocx”)

当你发现你的ShockwaveFlash程序提示你“没有注册”,那你可能缺少了“Microsoft Multimedia Control, version 6.0”控件,可以先添加这个控件到“工具箱”中。这个控件在“C:/WINDOWS/system32/MCI32.OCX”,如果没有可以通过百度上网下载一个,我在本机没有找到,就在网上下载了该文件。

 

那我们现在就镶嵌一个FLASH到程序中

 

Movie: flash 的存放地址

EmbedMovie: 是否嵌入到程序的资源中。

在 InitializeComponent();控件都加载完成后, FlashBox_UI.Movie = Application.StartupPath + "//flashplayer.swf"; 连接嵌入的SWF文件

Form1.cs文件如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace flashShell2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            FlashBox_UI.Movie = Application.StartupPath + "//flashplayer.swf";

        }

    }

}

 

---------------------------------flash c#通讯--------------------------------------

在 Flash 的 ActionScript 中,可以通过 FSCommand 函数与 hosting app 通信,该函数有两个参数,分别是:

command: 命令名称

parameters: 参数

例子:

on(press){

     fscommand("Circule", "Green");

}

在 C# 中,处理 flash 对象的 FSCommand 事件即可。

如果该事件处理函数的 EventArgs 为 e, 则有如下对应关系:

e.command -> flash 中调用 FSCommand 时的 command 参数;

e.args -> flash 中调用 FSCommand 时的 arguments 参数。

在 C# 中往 Flash 传递数值用 SetVariable 方法:

axShockwaveFlash1.SetVariable("variablename", "valueasstring");

对应的,有一个 GetVariable 方法可以获得 flash 中的变量值。

FSCommand 的参数只能传递一个,所以其功能存在一定的局限性。在你需要传递多个参数的时候,则需要在调用方用字符串拼接各个参数值,然后在被调用方重新解开。这种办法使得复杂的传值显得很丑陋。

不过,除了 FSCommand 外,我们还有另一种办法和 flash 通信,就是使用 Flash Player 8 External API.

(http://www.codeproject.com/cs/media/flashexternalapi.asp)

使用 External API,可以实现 ActionScript 和 C# 的双向调用。其好处就在于每次调用时的参数和返回值都通过一个 xml 文档来传递,这样就比 FSCommand 功能完善了很多。当然在 C# 中,我们也需要声明一下外部函数实现的对应关系。

代码片段:

Flash ActionScript 中声明提供给 hosting application 调用的回调函数:

import flash.external.ExternalInterface;

ExternalInterface.addCallback("loadAndPlayVideo", null, loadAndPlayVideo);

C# 中调用 Flash 的情形:

      flashPlayer.CallFunction("<invoke" +

          " name=/"loadAndPlayVideo/" returntype=/"xml/">

          <arguments><string>" + fileDialog.FileName +

          "</string></arguments></invoke>");

在 ActionScript 中调用 C# 函数:

ExternalInterface.call("ResizePlayer",

       videoPlayer.metadata.width, videoPlayer.metadata.height);

在 C# 中声明被 Flash 调用的函数:

flashPlayer.FlashCall +=

  new _IShockwaveFlashEvents_FlashCallEventHandler(flashPlayer_FlashCall);

在此,我们可以看到 C# 和 Flash 进行通信还是相当方便的。

除此之外,我顺便搜索到其他一些和 flash 有关的不错的文章:

Flash and .NET with FlashRemoting

http://www.codeproject.com/aspnet/FlashRemoting.asp

Multiple File Upload With Progress Bar Using Flash and ASP.NET

http://www.codeproject.com/aspnet/FlashUpload.asp

Flash GUI for your exe using minimalistic approach (C++)

http://www.codeproject.com/useritems/FlashGui.asp

C#中的回调函数

axShockwaveFlash.FlashCall +=

     new _IShockwaveFlashEvents_FlashCallEventHandler(SetNum);

public void SetNum(object sender,_IShockwaveFlashEvents_FlashCallEvent e)

   {

//得到参数列表

    ArrayList paraList = GetParaList(e.request);

   }

public ArrayList GetParaList(string ParaListXml)

   {

    XmlDocument doc = new XmlDocument();

    doc.LoadXml(ParaListXml);

 

    XmlNodeList pareNodeList = doc.GetElementsByTagName("string");

 

    ArrayList paraList = new ArrayList();

    foreach(XmlNode node in pareNodeList)

    {

     paraList.Add(node.InnerText);

    }   

    return paraList;

   }

---------------------------------flash c#去掉右键菜单--------------------------------------

方法一:

这个方法比较复杂,也比较繁琐,主要是用到API函数的调用。代码如下:

 

#region 去掉Flash右键菜单,API函数的声明

        private const int GWL_WNDPROC = -4;

        public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);       

        private IntPtr OldWndProc = IntPtr.Zero;

        private FlaWndProc Wpr = null;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

        private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam) {

            if(msg == 516)   //516就是对应鼠标的右键,当然你也可以用0X0204右键鼠标的16进制编码

                return (IntPtr)0;   //什么都不做

            return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);

        }

      #endregion

将以上代码放在窗体声明字段的地方。

注:要调用API函数就必须引用一个命名空间:

using System.Runtime.InteropServices;

然后在窗体的载入事件里面添加如下代码:

private void Flash_Load(object sender, EventArgs e)

{

   this.Wpr = new FlaWndProc(this.FlashWndProc);

   this.OldWndProc = SetWindowLong(Myflash.Handle, GWL_WNDPROC, Wpr); //关联flash控件

}

如此则大功告成,看看是不是把Flash右键菜单给去掉了!!

 

方法二:

这个方法很简单,也很灵活,主要用到继承和重写等面向对象的核心内容。

首先声明一个类,让它去继承AxShockwaveFlashObjects.AxShockwaveFlash,该类是实例化Flash控件生成的类。该类中包含各种Flash的事件和属性,在这里我们只对右键菜单的事件感兴趣,因此我们去重写该事件。

类的代码如下:

public class FlashRightKey : AxShockwaveFlashObjects.AxShockwaveFlash

    {

        //定义一个公共类FlashRightKey(类名自己定义)来继承AxShockwaveFlashObjects.AxShockwaveFlash(在实例化Shockwave Flash Object控件后生成)类

        protected override void WndProc(ref Message m) //重载WndProc方法(此方法即消息处理机制)

        {

            if (m.Msg == 0X0204) //0×0204即鼠标右键的16进制编码

                return; //返回并不输出

            else

                base.WndProc(ref m); //如果不是右键的话则返回正常的信息

        }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值