Как я могу остановить AxWindowsMediaPlayer от принятия любых пользовательских команд в C # - PullRequest
1 голос
/ 06 января 2012

В моем демокоде встроенный проигрыватель Windows Media начинает загружать и воспроизводить видео. Плеер не показывает элементы управления, все остальные параметры являются параметрами по умолчанию. Пока это работает.

Что не работает, так это то, что не все взаимодействие с пользователем прекращается. Например, двойным щелчком можно изменить режим на полноэкранный, а также щелкнуть правой кнопкой мыши полный контекст.

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

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

Как я могу изолировать плеер от пользователя и управлять им только через код?

Ответы [ 3 ]

2 голосов
/ 13 октября 2012

попробуй axWindowsMediaPlayer1.Ctlenabled = False

РЕДАКТИРОВАТЬ: извините, это для VB ..

2 голосов
/ 07 января 2012

Друг только что помог мне решить эту проблему.

Отключить контекстные меню было довольно просто

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;
        }
    }

Особая благодарность моему безымянному другу и "notespk11" из Microsoft Developer Network Frorums.

Есть некоторые небольшие проблемы с кодом - мне не нравится, что сообщения скрыты от меня, во-первых, и я также хотел бы избавиться от двух глобальных зависимостей Cursor и Application. Но что касается этого вопроса, я считаю, что на него дан ответ.

1 голос
/ 29 ноября 2013
axWindowsMediaPlayer1.Ctlcontrols.stop();
...