最近接了一個案子是要製作一個光碟的AutoRun選單程式
一開始的想法是利用Flash來進行製作
但找了資料後發現新的Flash player版本已經無法直接透過fscommand來開啟外部的檔案
必須寫bat的方式來進行對應
有興趣的人可以參考這篇
http://milkmidi.blogspot.tw/2010/06/flash-fscommand.html
但因為我這個案子裏面包含了許多的檔案連結要開啟
用bat的方式要一個一個去對應實在是有點麻煩
後來找到了ExternalInterface的方法可以呼叫外部的程式
因此有了利用C#嵌入swf檔並透過AS3呼叫C#開啟外部的程式
詳細的方法請參考以下兩篇
http://blog.another-d-mention.ro/programming/communicate-betwen-c-and-an-embeded-flash-application/
http://help.adobe.com/zh_TW/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cb0.html
我主要是參考Adobe提供的proxy_ExternalInterfaceCall
來擷取AS3傳來的內容
以下取自C#程式碼
private Flash.External.ExternalInterfaceProxy proxy;
public Form1()
{
InitializeComponent();
axShockwaveFlash1.LoadMovie(0, Application.StartupPath.ToString() + "\\air\\list.swf");
proxy = new Flash.External.ExternalInterfaceProxy(axShockwaveFlash1);
proxy.ExternalInterfaceCall += new Flash.External.ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall);
}
//--------------中間省略-----------------
private object proxy_ExternalInterfaceCall(object sender, Flash.External.ExternalInterfaceCallEventArgs e)
{
switch (e.FunctionCall.FunctionName)
{
case "setStage":
this.Size= new System.Drawing.Size(Convert.ToInt32(e.FunctionCall.Arguments[0]),Convert.ToInt32(e.FunctionCall.Arguments[1])+25);
axShockwaveFlash1.Size = new System.Drawing.Size(Convert.ToInt32(e.FunctionCall.Arguments[0]), Convert.ToInt32(e.FunctionCall.Arguments[1]));
return null;
case "oenFile":
//此處為開啟外部程式的method
Process.Start(Application.StartupPath.ToString() + (string)e.FunctionCall.Arguments[0].ToString());
return null;
default:
return null;
}
}
而AS3的部分則是使用ExternalInterface這個類別來進行溝通
以下取自AS3
ExternalInterface.addCallback("myFunction", callMe);
function callMe(name:String):String
{
var result:uint=ExternalInterface.call("setStage",720,440);
//呼叫C#的proxy_ExternalInterfaceCall並且傳遞三個字串
return "";
}
aList.addEventListener(Event.CHANGE, showData);
function showData(event:Event) {
trace(event.target.selectedItem.data);
ExternalInterface.call("oenFile",String(event.target.selectedItem.data));
//呼叫C#的proxy_ExternalInterfaceCall並且傳傳遞selected中的data資料(即為檔案路徑)
}
透過以上的方法便可以直接利用AS3告訴C#開啟的路徑
就可以省去一個一個bat的時間
以下附上C#跟AS3的原始檔
http://dl.dropbox.com/u/12533246/CDROOT.rar
其中也包含已經Release的檔案
有需要的朋友可以直接使用
解壓縮後點擊WindowsFormsApplication11.exe即可觀看效果
若要直接使用的話請把做好的swf檔案放到air資料夾中
並且記得在AS檔案開頭中加入
ExternalInterface.addCallback("myFunction", callMe);
function callMe(name:String):String
{
var result:uint=ExternalInterface.call("setStage",720,440);
//720,440為Flash的場景大小
return "";
}
C#才可以知道要建立多大的場景大小
若還有其他問題也歡迎回應詢問
PS
由於C#是.netframework4架構下面的軟體,所以執行的電腦必須有安裝過.netframework4
及flashplayer
為了解決比較舊的電腦可能沒有安裝過.netframework4
我找了另外一套軟體較做AutoPlay Media Studio
AutoPlay Media Studio是一套商業的軟體,有需要的朋友可以自己去網路上搜尋相關的資料
此軟體產生出來的exe檔便無需安裝.netframework
但flashplayer還是必須的
以下附上AutoPlay Media Studio做出來的檔案及原始檔
http://dl.dropbox.com/u/12533246/FlashAPMS.rar
flash原始檔附在CD_Root\AutoPlay\Flash\air當中
但release出來的檔案必須放在CD_Root\AutoPlay\Flash\
其他需要注意的地方為
AS3中 開啟檔案的方式要改為
fscommand(String(event.target.selectedItem.data));
String(event.target.selectedItem.data)表示檔案的相對位置
路徑用\\來表示(例如dir01/011.txt必須設定為dir01\\011.txt)
並且在AutoPlay Media Studio的Flash元件中加入Script
File.Open(e_FSCommand, "", SW_SHOWNORMAL);
有需要的人可以直接下載使用
直接替換掉CD_Root\AutoPlay\Flash\list.swf即可
場景大小必須是720x440