1

当在 Awesomium 中运行时由 YouTube API 生成时,我是否能够在 C# 中捕获 JavaScript 事件?

我将以下 HTML 加载到我的 Awesomium 浏览器中:

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

    <script src="http://www.youtube.com/player_api"></script>
    <script>
        var player;

        function onYouTubePlayerAPIReady() {
            player = new YT.Player('player', {
                height: '390',
                width: '640',
                videoId: '0Bmhjf0rKe8',
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            });
        }

        function onPlayerReady(event) {
            event.target.playVideo();
        }

        function onPlayerStateChange(event) {
            if (event.data == 0) {
                alert('done');
            }
        }
    </script>
</body>

如何onPlayerStateChange在 C# 中捕获(或由它生成的另一个事件),以便我的应用程序可以在视频结束时做出反应?

4

3 回答 3

2

如果您使用的是 Awesomium.NET 1.7 RC,请按照以下步骤操作:

  • 创建一个全局 JavaScript 对象。看:CreateGlobalJavascriptObject
  • 将自定义方法添加到全局 JS 对象,并绑定到它。看:JSObject.Bind
  • 从处理程序内部调用自定义方法onPlayerStateChange

    function onPlayerStateChange(event) {
        if (event.data == 0) {
            myGlobalObject.onPlayerStateChange();
        }
    }
    

(该示例假设您创建了一个名为myGlobalObject的全局 JS 对象,并为其添加了onPlayerStateChange自定义方法。)

这将触发JavascriptMethodEventHandler您在JSObject.Bind.

于 2013-02-01T21:32:01.410 回答
0

简而言之,您希望 c# 监听 javascript 事件!好的。

这很容易使用 Awesomium.NET。

将 awesomium 控件放入表单后,默认情况下会创建一个对象

网络控制1

在 form_load 方法中创建一个类似 document.ready 的事件处理程序,当文档准备好时将调用添加的事件

webControl1.DocumentReady += webControl1_DocumentReady; 

让我们从 c#(比如说myGlobalObject.myMethod(){ })创建一个 javascript 方法。脚本将由 awesomium 注入页面。然后,我们将侦听从 javascript 调用该函数的事件。

你甚至可以从你的onPlayerStateChange

function onPlayerStateChange(event) {
   myGlobalObject.myMethod();
}

这样当您的 javascript 事件触发时,它会调用(myGlobalObject.myMethod();)在 c# 中创建的 javascript 方法

所以我们需要创建全局对象,然后像这样的关联方法

using (JSObject myGlobalObject = webControl1.CreateGlobalJavascriptObject("myGlobalObject"))
        {
            // The handler is of type JavascriptMethodEventHandler. Here we define it
            // using a lambda expression.
            myGlobalObject.Bind("myMethod", true, (s, ee) =>
            {
                // Provide a response.
                ee.Result = "My response";
            });
        }

这将在您的页面中执行必要的 javascript 对象和方法注入。所以

在 webControl1_DocumentReady 方法(我们之前附加)中,您将拥有

 void webControl1_DocumentReady(object sender, UrlEventArgs e)
        {


            dynamic myGlobalObject_ = (JSObject)webControl1.ExecuteJavascriptWithResult("myGlobalObject");
            using (myGlobalObject_)
            {
                myGlobalObject_.myMethod = (JavascriptMethodEventHandler)OnCustomJavascriptMethod;

            }
        }

您将不得不像这样创建 OnCustomJavascriptMethod 方法(例如)

private void OnCustomJavascriptMethod(object sender, JavascriptMethodEventArgs e)
        {
            MessageBox.Show("hi");
        }

当你的javascript事件onPlayerStateChange被调用时,这个方法(OnCustomJavascriptMethod)将在你的c#中被调用(因为它会调用myGlobalObject.myMethod();)

就这样!等待你的 onPlayerStateChange 触发并且你在 c# 中的方法 OnCustomJavascriptMethod(object sender, JavascriptMethodEventArgs e) 将被调用,从而使 javascript “控制 C# 方法”

您可以在https://awesomium.com/上找到有关 awesomium 的更多信息。您可以在http://awesomium.com/downloads/awesomium_1_7_0_sdk_win.exe下载适用于 Windows 的 sdk并开始使用。

于 2013-04-25T20:32:12.523 回答
0

我真的不知道 awesomium(从未使用过),所以我不知道是否有“本机”方式来做到这一点,但总是可以选择使用 ajax 向您的程序发送消息

您可以按照此处HttpServer的说明设置本地,然后获取所需的通知。

您也可以使用TcpListener我认为的简单方法,这会更简单,但需要一些工作来处理 http 标头(但我想我在网络上的某个地方看到了一个用 C# 编写的类,但事实并非如此非常复杂,因为您只需要管理 GET 请求)。如果您认为这可能是一种方法,我可以在这篇文章的编辑中写一些更明确的东西。

无论如何,希望这有帮助

于 2013-01-30T01:22:47.337 回答