1. 程式人生 > >解決VS中Shockwave Flash Object不能引入,未註冊問題

解決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控制元件去掉右鍵選單。