解決VS中Shockwave Flash Object不能引入,未註冊問題
將Flash融合到WinForm中能夠增強程式的多媒體效果和炫麗的外觀。現在我們就來看看在C#桌面程式中如何插入Flash視訊,而且去掉煩人的右鍵選單。
首先要插入Flash就必須使用Flash控制元件,在工具欄右鍵選擇“選擇項…”,然後在“COM元件”面板下點選“瀏覽”按鈕,在本機電腦C:/WINDOWS/system32/Macromed/Flash/目錄裡選擇Flash8.ocx(也有可能是Flash9F.ocx,版本不同所致),然後點選確定就可以了。但到這裡還沒有完,因為要使用Flash控制元件必須註冊它。
在CMD裡面輸入如下:
regsvr32 C:/WINDOWS/system32/Macromed/Flash/Flash8.ocx
系統會提示註冊成功,這個時侯就可以在VS2008裡面使用該控制元件了!
開啟VS2008,新建一個Windows程式,然後把剛才我們選擇的Flash控制元件Shockwave Flash Object拖到窗體中,這時窗體中會出現一個白色的矩形框,Name屬性我們設定為Myflash,在裡面可以播放我們需要的swf檔案。
注意到該控制元件主要有幾個屬性:
Name屬性,這個是所有物件都會有的。
Menu屬性,這個是Flash選單項,預設值為true,也就是右鍵的時候會出現完整的Flash選單,如果設定為False,則只出現最簡的選單(設定與關於)。
Move屬性,這個屬性是用來指定要播放的Flash檔案的。
Playing屬性,指定是否裝在影片之後馬上播放。
Quality屬性,設定影片的質量。
Scalemode屬性,設定影片的縮放模式。
Visible屬性,設定影片控制元件的可視與否。
接下來我們在窗體中放置一個按鈕,Text屬性設定為LoadSwf。雙擊新增事件程式碼如下:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Flash檔案|*.swf";
DialogResult dr = ofd.ShowDialog();
if (dr == DialogResult.OK)
{
Myflash.Movie = ofd.FileName;
Myflash.Play();
}
這樣當程式執行的時候點選按鈕會要我們選擇一個SWF檔案,選擇好後確定就自動播放了!
當然,我們還可以新增一些按鈕,分別為Play,Pause
Play按鈕的播放功能如下:
This.Myflash.Play();
Pause按鈕的暫停功能如下:
This.Myflash.StopPlay();
這裡就不再囉嗦了,各位園友可以自行去研究一些常用的功能。下面我們主要來講解如何消去煩人的Flash右鍵選單!
消去Flash右鍵選單有兩種方法(本人愚笨,到目前只發現這兩種):
方法一:
這個方法比較複雜,也比較繁瑣,主要是用到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); //如果不是右鍵的話則返回正常的資訊
}
}
類寫好了,我們要在Flash控制元件裡面使用它,必須在例項化Flash控制元件的時候用如下程式碼(寫在Flash.Designer.cs檔案相應的地方):
private FlashRightKey MyFlash2;
this.MyFlash2 = new Namespace.FlashRightKey();
注:Namespace為工程專案的名稱空間。
剩下的就和不用我多說了,大功告成,實現了Flash控制元件去掉右鍵選單。