1

私のデモコードでは、埋め込まれた Windows Media Player がビデオの読み込みと再生を開始します。プレーヤーにはコントロールが表示されません。他のすべてのオプションはデフォルトのオプションです。これまでのところ、これは機能します。

うまくいかないのは、すべてのユーザー インタラクションが停止されるわけではないということです。たとえば、ダブルクリックでモードをフルスクリーンに変更でき、右クリックで完全なコンテキストを取得することもできます。

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;

ダブルクリックを無効にするには、メッセージフィルタが必要です。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 DeveloperNetworkFrorumsの「remarkpk11」に特に感謝します。

コードにはいくつかの小さな問題があります-そもそもメッセージが私から隠されているのは好きではありません。また、カーソルとアプリケーションの2つのグローバルな依存関係を取り除きたいと思っています。しかし、この質問に関する限り、私はそれが答えられたと思います。

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