1

在我的演示代码中,嵌入式 Windows 媒体播放器开始加载和播放视频。播放器不显示任何控件,所有其他选项都是默认选项。到目前为止,这有效。

不起作用的是并非所有用户交互都停止了。例如,可以通过双击将模式更改为全屏,也可以通过右键单击获得完整的上下文。

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

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

如何将播放器与用户隔离,仅通过代码控制播放器?

4

3 回答 3

3

尝试axWindowsMediaPlayer1.Ctlenabled = False

编辑:对不起,这是为 vb ..

于 2012-10-12T21:36:49.030 回答
2

一个朋友刚刚帮我解决了这个问题。

禁用上下文菜单相当容易

axWindowsMediaPlayer1.enableContextMenu = false;

禁用双击需要一个消息过滤器——网上已经有解决方案

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”。

代码有一些小问题——我不喜欢消息一开始就对我隐藏,我也很想摆脱两个全局依赖项 Cursor 和 Application。但就这个问题而言,我认为它已经回答了。

于 2012-01-07T10:46:46.283 回答
1
axWindowsMediaPlayer1.Ctlcontrols.stop();
于 2013-11-29T11:03:02.510 回答