如何从 javascript 调用中打开新的 winform?
How to open new winform from javascript call?
我目前在使用 CEFSHARP 时遇到的主要问题是,我无法弄清楚如何通过在 cefsharp chromium 浏览器控件中使用 javascript 来生成新的 windows 表单。
我尝试在 google 上搜索解决方案,但我找不到任何与在页面中单击 link/button 时尝试生成新 windows 表单相关的内容。本质上是从 javascript 页面与 vb.net 客户进行对话。
据我了解,我认为这与线程问题有关,其中主窗体的 UI 主线程未与 javascript 注册对象正确通信。
我目前在VB(VS2015)的代码如下:
Imports System.Windows.Forms
Imports System.Security.Permissions
Imports CefSharp.WinForms
Imports CefSharp
Public Class Form1
Private WithEvents browser As ChromiumWebBrowser
Friend Shared MyInstance As Form1
Public Sub New()
InitializeComponent()
Dim settings As New CefSettings()
CefSharp.Cef.Initialize(settings)
browser = New ChromiumWebBrowser("/test.php") With {
.Dock = DockStyle.Fill
}
webcontrol.Controls.Add(browser)
browser.JavascriptObjectRepository.Register("CallBrowser", New InteractAPP(), True)
End Sub
Public Sub SpawnForm()
Dim myPop As New Form2
myPop.Show()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MyInstance = Me
End Sub
End Class
Public Class InteractAPP
Public Sub showMessage()
If (Form1.MyInstance IsNot Nothing) AndAlso Not Form1.MyInstance.IsDisposed Then
MsgBox("It Works!")
End If
End Sub
Public Sub createWin()
form1.MyInstance.SpawnForm()
End Sub
Public Sub doHide()
If (Form1.MyInstance IsNot Nothing) AndAlso Not Form1.MyInstance.IsDisposed Then
Form1.MyInstance.Close()
End If
End Sub
End Class
我的通用网页上的代码如下:
<html>
<head>
<title></title>
<script>
// Setup communication to web browser control
(async function() {
await CefSharp.BindObjectAsync("CallBrowser", "bound");
})();
// calling ends here
function doClose()
{
CallBrowser.doHide();
}
function openWindow()
{
//ByVal url As String, ByVal title As String, ByVal w As Integer, ByVal h As Integer, ByVal freeze As Integer, ByVal loadMaximize As Integer
CallBrowser.createWin();
}
</script>
</head>
<body>
<input type='button' value='Close Win' onClick='doClose();'/>
<input type='button' value='Spawn Popup' onClick='openWindow();'/>
</body>
</html>
当我在引用 openWindow() 的网页上单击 Spawn Popup 按钮时,在 VB 中调用该函数时没有任何反应。
我在任何地方都找不到有关如何使其正常工作的任何信息。
您看到的行为是正常的,因为您通过 CallBrowser 对象从 JavaScript 执行的所有操作都 运行 在单独的非 UI 线程中。所以,当你说这是一个线程问题时,你是对的。
要存档您想要的内容,您必须从 UI 线程创建一个新的 window。您可以使用 Invoke or BeginInvoke 方法 运行 线程上的代码,该线程拥有您已有的控件(示例中的 Form1 实例)。以下是您的 SpawnForm sub 的外观:
Delegate Sub InvokeDelegate()
Public Sub SpawnForm()
Me.BeginInvoke(New InvokeDelegate(
Sub()
Dim myPop As New Form2
myPop.Show()
End Sub
))
End Sub
我目前在使用 CEFSHARP 时遇到的主要问题是,我无法弄清楚如何通过在 cefsharp chromium 浏览器控件中使用 javascript 来生成新的 windows 表单。
我尝试在 google 上搜索解决方案,但我找不到任何与在页面中单击 link/button 时尝试生成新 windows 表单相关的内容。本质上是从 javascript 页面与 vb.net 客户进行对话。
据我了解,我认为这与线程问题有关,其中主窗体的 UI 主线程未与 javascript 注册对象正确通信。
我目前在VB(VS2015)的代码如下:
Imports System.Windows.Forms
Imports System.Security.Permissions
Imports CefSharp.WinForms
Imports CefSharp
Public Class Form1
Private WithEvents browser As ChromiumWebBrowser
Friend Shared MyInstance As Form1
Public Sub New()
InitializeComponent()
Dim settings As New CefSettings()
CefSharp.Cef.Initialize(settings)
browser = New ChromiumWebBrowser("/test.php") With {
.Dock = DockStyle.Fill
}
webcontrol.Controls.Add(browser)
browser.JavascriptObjectRepository.Register("CallBrowser", New InteractAPP(), True)
End Sub
Public Sub SpawnForm()
Dim myPop As New Form2
myPop.Show()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MyInstance = Me
End Sub
End Class
Public Class InteractAPP
Public Sub showMessage()
If (Form1.MyInstance IsNot Nothing) AndAlso Not Form1.MyInstance.IsDisposed Then
MsgBox("It Works!")
End If
End Sub
Public Sub createWin()
form1.MyInstance.SpawnForm()
End Sub
Public Sub doHide()
If (Form1.MyInstance IsNot Nothing) AndAlso Not Form1.MyInstance.IsDisposed Then
Form1.MyInstance.Close()
End If
End Sub
End Class
我的通用网页上的代码如下:
<html>
<head>
<title></title>
<script>
// Setup communication to web browser control
(async function() {
await CefSharp.BindObjectAsync("CallBrowser", "bound");
})();
// calling ends here
function doClose()
{
CallBrowser.doHide();
}
function openWindow()
{
//ByVal url As String, ByVal title As String, ByVal w As Integer, ByVal h As Integer, ByVal freeze As Integer, ByVal loadMaximize As Integer
CallBrowser.createWin();
}
</script>
</head>
<body>
<input type='button' value='Close Win' onClick='doClose();'/>
<input type='button' value='Spawn Popup' onClick='openWindow();'/>
</body>
</html>
当我在引用 openWindow() 的网页上单击 Spawn Popup 按钮时,在 VB 中调用该函数时没有任何反应。
我在任何地方都找不到有关如何使其正常工作的任何信息。
您看到的行为是正常的,因为您通过 CallBrowser 对象从 JavaScript 执行的所有操作都 运行 在单独的非 UI 线程中。所以,当你说这是一个线程问题时,你是对的。
要存档您想要的内容,您必须从 UI 线程创建一个新的 window。您可以使用 Invoke or BeginInvoke 方法 运行 线程上的代码,该线程拥有您已有的控件(示例中的 Form1 实例)。以下是您的 SpawnForm sub 的外观:
Delegate Sub InvokeDelegate()
Public Sub SpawnForm()
Me.BeginInvoke(New InvokeDelegate(
Sub()
Dim myPop As New Form2
myPop.Show()
End Sub
))
End Sub