我有一个使用CEFSharp的VB.NET Winforms应用程序,我对它非常满意。
目前我能够将JS代码注入目标站点,例如在网站上触发功能或设置文本框值等。 在此期间,我还设法从例如目标网站上的文本框控件。
现在我正在进一步发展:
我还希望能够在显示的网站上对javascript事件的代码做出反应。 (例如,当在网站上触发特定的javascript事件时,我可以在我的代码中调用vb.net函数)
此刻我正特意看到鼠标移动时捕捉鼠标事件和(如果可能的话)。
我已经在网上找到了2-3个相关的引用,这里是C#中的Stackoverflow(包括CEFSharp FAQ中的例子),但我不完全确定如何将它移植到VB.NET。请参阅此处提到的示例:
https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#JSEvent
在Stackoverflow上:How to trap/listen javascript function or events in cefsharp
所以原则上它应该是可能的,但我只是迷失在VB.NET翻译中。
有人能指出我正确的方向吗? 在此先感谢您的帮助。
答案 0 :(得分:1)
我在另一个论坛上的一些专家的帮助下,将官方CEFSharp示例移植到VB.NET上了....
以下是我使用Visual Studio 2017所做的工作。
首先我创建了BoundObject类并将其添加到我已经使用CEFSharp的程序中:
Imports CefSharp.WinForms
Imports CefSharp
Public Class BoundObject
Friend browser As ChromiumWebBrowser
Public Sub browser_FrameLoadEnd(sender As Object, e As FrameLoadEndEventArgs)
If e.Frame.IsMain Then
browser.ExecuteScriptAsync("document.body.onmouseup = Function()
{
bound.onSelected(window.getSelection().toString());
}
"");")
End If
End Sub
Public Sub OnSelected(ByVal selected As String)
MessageBox.Show("The user selected some text [" & selected & "]")
End Sub
End Class
然后我将以下代码添加到Public Sub New()函数的末尾:
CefSharpSettings.LegacyJavascriptBindingEnabled = True
Dim obj As New BoundObject()
obj.browser = browser
browser.RegisterJsObject("bound", obj)
AddHandler browser.FrameLoadEnd, AddressOf obj.browser_FrameLoadEnd
第一行是必要的,因为我使用的是CEFSharp的V63,并且从这个版本开始有一种处理绑定函数的新方法,但是通过启用旧版绑定方法,旧方法仍然可用。
此外,我不得不更改事件名称,因为似乎C#示例中的原始事件名称已在较新版本的CEFSharp中重命名。
我使用Devtools控制台测试了这段代码,我可以调用bound.onSelected函数并将一个字符串从JS传递到我的vb.net应用程序,然后使用JS从网站收到的字符串激活文本框。
希望这可以帮助一些人,因为似乎很少有例子。