c# - C#Youtube API,不触发事件

标签 c# javascript winforms youtube

我整天都在互联网上上下搜索,但我很困惑。

我想做的是使用youtube API在C#中播放youtube视频。然后,我想在视频播放完毕后调用表单上的函数。不幸的是,我似乎找不到找到触发事件的方法。

(使用Visual C#2010 Express,并具有IE9。以供引用。)

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    using System.Runtime.InteropServices;
    public partial class Form1 : Form
    {
        // This nested class must be ComVisible for the JavaScript to be able to call it.
        [ComVisible(true)]
        public class ScriptManager
        {
            // Variable to store the form of type Form1.
            private Form1 mForm;

            // Constructor.
            public ScriptManager(Form1 form)
            {
                // Save the form so it can be referenced later.
                mForm = form;
            }

            // This method can be called from JavaScript.
            public void MethodToCallFromScript()
            {
                // Call a method on the form.
                mForm.GoToNext();
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        public void GoToNext()
        {
            MessageBox.Show("Play the next song");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://localhost/index.html");
        }
    }
}

那是我的Form1.cs代码。 Form1.cs [Design]仅由webBrowser控件组成。

我已经尝试了很多方法来使其工作,从安装http服务器以运行html'live'到直接从计算机上的文件运行它,再到以代码作为字符串设置文档文本。到目前为止,一切都使我失望。在IE9中,如果我在本地打开index.html文件(作为文件而不是通过Web服务器),则不会触发事件。如果我在网络服务器上实时运行它,则事件会触发。但是,在C#webBrowser控件中,无论从何处运行,这些事件似乎根本不会触发。
<!DOCTYPE html>
<html>
<body>

<div id="player"></div>
<script>
    var tag = document.createElement('script');
    tag.src = "http://www.youtube.com/player_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

    var player;
    function onYouTubePlayerAPIReady() {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            playerVars: { 'autoplay': 1, 'controls': 1,'autohide':1,'wmode':'opaque' },
            videoId: 'G4cRrOcDXXY',
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        });
    }
    function onPlayerReady(event) {
            event.target.mute();
    }
    function onPlayerStateChange(event) {        
        if(event.data === 0) {            
            alert('done');
            window.external.MethodToCallFromScript();
        }
    }
</script>
</body>
</html>

我没有主意,因此不胜感激。我很想在C#WebBrowser控件中触发事件。

最佳答案

哇。当我尝试其他成功的尝试时,我正在输入我的最新问题。问题,我需要导航到网络服务器上的.html文件,并且它会开始播放视频,视频播放完后,我将让javascript告诉C#导航到具有不同youtube的相同URL ID(播放另一个视频)。第二个视频将无法触发事件。

我已经通过使用其他javascript(例如what was mentioned here)克服了这一问题。

我确实开始使用Visual Studio 2013 Express和IE11。这消除了我自己碰到的很多问题。我会向大家提供我当前的代码,以防万一有人遇到我一直在处理的问题。

我的表格:

using System;
using System.Windows.Forms;
using System.Data.SQLite;

namespace WindowsFormsApplication1
{
    using System.Runtime.InteropServices;


    public partial class Form1 : Form
    {
        // This nested class must be ComVisible for the JavaScript to be able to call it.
        [ComVisible(true)]
        public class ScriptManager
        {
            // Variable to store the form of type Form1.
            private Form1 mForm;

            // Constructor.
            public ScriptManager(Form1 form)
            {
                // Save the form so it can be referenced later.
                mForm = form;
            }

            public void AnotherMethod(string message)
            {
                mForm.GoToNext();
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        public void GoToNext()
        {
            timer1.Interval = 2000;
            timer1.Enabled = true;
        }

        public object MyInvokeScript(string name, params object[] args)
        {
            return webBrowser1.Document.InvokeScript(name, args);
        }
        public void SongCheck()
        {
            // Disable timer.  Enable it later if there isn't a song to play.
            if (timer1.Enabled)
            timer1.Enabled = false;

            // Connect to my SQLite db,
            SQLiteConnection mySQLite = new SQLiteConnection("Data Source=ytsongrequest.s3db;Version=3;");
            mySQLite.Open();

            // The SQLite DB consists of three columns. id, youtubeid, requestor
            // the 'id' auto increments when a row is added into the database.
            string sqlCommand = "select * from songs order by id asc limit 1";
            SQLiteCommand x = new SQLiteCommand(sqlCommand, mySQLite);

            SQLiteDataReader reader = x.ExecuteReader();
            if (reader.HasRows) {
                while (reader.Read())
                {
                    // Use our custom object to call a javascript function on our webpage.
                    object o = MyInvokeScript("createPlayerAndPlayVideo", reader["youtubeid"]);
                    label2.Text = reader["requestor"].ToString();
                    // Since we've played the song, we can now remove it.
                    x = new SQLiteCommand("delete from songs where id = " + reader["id"], mySQLite);
                    x.ExecuteNonQuery();
                }
                mySQLite.Close();
            }
            else
            {
                // Set a timer to check for a new song every 10 seconds.
                timer1.Interval = 10000;
                timer1.Enabled = true;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.ObjectForScripting = new ScriptManager(this);
            webBrowser1.Navigate("http://localhost/testing.html");

            GoToNext();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SongCheck();
        }
    }
}

我在服务器上拥有的HTML页面:
<!DOCTYPE html>
<html>
<body>

<div id="player"></div>

<script>
var tag = document.createElement('script');

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var query = getQueryParams(document.location.search);

var player;
var playerAPIReady;



function onYouTubePlayerAPIReady() {
    playerAPIReady = true;
}


function onPlayerReady() {
    player.playVideo();
    player.addEventListener('onStateChange', function(e) {
    if (e.data === 0) {
        window.external.AnotherMethod('Finished video');
    }
    });
}

function getQueryParams(qs) {
    qs = qs.split("+").join(" ");

    var params = {}, tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])]
            = decodeURIComponent(tokens[2]);
    }

    return params;
}

function createPlayerAndPlayVideo(id) {
    if(! playerAPIReady) {
        // player API file not loaded
        return;
    }
    if (! player) {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            videoId: id,
            events: {
                'onReady': onPlayerReady
            }
        });
    } 
    else {
        player.loadVideoById(id);
    }
}

</script>

</body>
</html>

关于c# - C#Youtube API,不触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21200158/

相关文章:

c# - 在我需要基于 XAML 控件进行计算的情况下,使用 MVVM 与控件交互的正确设计是什么?

c# - 更好的 MonoTouch 与 TestFlight 崩溃

javascript - XUL 文本框 addEventListener

c# - 单击单元格时选中 Datagridview 复选框

c# - 为什么在 Windows 经典主题中 TabControl 背景没有改变颜色?

c# - CTS和CLS有什么关系?

c# 如何将 double 格式设置为字符串并仅在必要时显示十进制数字?

javascript - 在 iOS 和 Chrome 上使用特定的 JavaScript 代码

javascript - 本地存储无法在 Chrome 和 Firefox 中运行,但可以在 Cognito 窗口和私有(private)窗口中运行

winforms - 使用 Treeview 和拆分控件在 Winforms 中实现拖放