2012-01-06 71 views
1

在我的democode中嵌入式Windows媒體播放器開始加載和播放視頻。播放器不顯示控件,所有其他選項都是默認選項。這到目前爲止有效。如何停止AxWindowsMediaPlayer接受C#中的任何用戶命令

不起作用的是,並非所有的用戶交互都停止。例如,可以通過雙擊將模式更改爲全屏模式,也可以通過右鍵點擊獲得完整的上下文。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     axWindowsMediaPlayer1.uiMode = "none"; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.URL = @"C:\stackoverflow.mp4"; 
    } 
} 

我該如何隔離播放器與用戶,只通過代碼控制播放器?

+0

設置Ctlenabled屬性設置爲false。 – 2012-01-07 15:45:15

+0

將CtlEnabled設置爲false不允許播放和停止視頻。一種可能的解決方法是在InitializeComponent()後面設置CtlEnabled = false,然後在播放之前將其設置爲true,然後再將其設置爲false。 – muccix 2016-05-10 11:27:52

回答

2

一位朋友剛剛幫我解決了這個問題。

禁用菜單已相當容易

axWindowsMediaPlayer1.enableContextMenu = false; 

禁用雙擊上下文需要一個消息過濾器 - there is already a solution on the web

Application.AddMessageFilter((IMessageFilter)CustomFilter(this/*Form*/, axWMP)); 

我已經重寫我的榜樣,我現在用這個代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     axWindowsMediaPlayer1.uiMode = "none"; 
     axWindowsMediaPlayer1.enableContextMenu = false; 
     Application.AddMessageFilter(new IgnoreMouseClickMessageFilter(this, axWindowsMediaPlayer1)); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.URL = @"C:\stackoverflow.mp4"; 
    } 
} 

class IgnoreMouseClickMessageFilter : IMessageFilter 
    { 
     private Control parent { get; set; } 
     private Control target { get; set; } 

     public IgnoreMouseClickMessageFilter(Control parent, Control target) 
     { 
      this.parent = parent; 
      this.target = target; 
     } 

     public bool PreFilterMessage(ref Message messageBeforeFiltering) 
     { 
      const Boolean FilterTheMessageOut = true; 
      const Boolean LetTheMessageThrough = false; 

      if (IsNull(parent)) return LetTheMessageThrough; 
      if (IsNull(target)) return LetTheMessageThrough; 
      if (WasNotClickedOnTarget(parent, target)) return LetTheMessageThrough; 
      if (MessageContainsAnyMousebutton(messageBeforeFiltering)) return FilterTheMessageOut; 
      return LetTheMessageThrough; 
     } 

     private bool MessageContainsAnyMousebutton(Message message) 
     { 
      if (message.Msg == 0x202) return true; /* WM_LBUTTONUP*/ 
      if (message.Msg == 0x203) return true; /* WM_LBUTTONDBLCLK*/ 
      if (message.Msg == 0x204) return true; /* WM_RBUTTONDOWN */ 
      if (message.Msg == 0x205) return true; /* WM_RBUTTONUP */ 
      return false; 
     } 

     private bool WasNotClickedOnTarget(Control parent, Control target) 
     { 
      Control clickedOn = parent.GetChildAtPoint(Cursor.Position); 
      if (IsNull(clickedOn)) return true; 
      if (AreEqual(clickedOn, target)) return false; 
      return true; 
     } 

     private bool AreEqual(Control controlA, Control controlB) 
     { 
      if (controlA == controlB) return true; 
      return false; 
     } 

     private bool IsNull(Control control) 
     { 
      if (control == null) return true; 
      return false; 
     } 
    } 

特別感謝我的朋友無名,並從在Microsoft Developer Network Frorums「remarkpk11」。

代碼有一些較小的問題 - 我不喜歡消息隱藏在我的第一位,我也很想擺脫兩個全局依賴項遊標和應用程序。但就這個問題而言,我認爲它得到了回答。

+0

似乎有一個更好的出路,至此我沒有探索,因爲我正在改變我的用戶界面到XNA。 – Johannes 2012-01-17 20:37:58

2

嘗試axWindowsMediaPlayer1.Ctlenabled = False

編輯:對不起,這是爲VB ..

+0

無論如何,謝謝。 :) – Johannes 2012-10-13 19:18:23

1
axWindowsMediaPlayer1.Ctlcontrols.stop(); 
+0

這不會回答問題,它只會停止播放。 – 2013-11-29 11:38:05