如何在 WPF 上的 WebBrowser 中从 javascript 调用客户端代码?
How to call client code from javascript in WebBrowser on WPF?
我正在尝试从示例 https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.objectforscripting?redirectedfrom=MSDN&view=netframework-4.8#System_Windows_Forms_WebBrowser_ObjectForScripting 中给出的 WebBrowser 控件调用 WPF 客户端代码。 link 中提供的示例适用于 Windows 表单。我正在尝试在 WPF 中做类似的事情。但是,我收到以下错误。
托管调试助手 'NonComVisibleBaseClass' : '进行了 QueryInterface 调用,请求 COM 可见托管的默认 IDispatch 接口 class 'WpfApp2.MainWindow'。但是,由于此 class 没有明确的默认接口并且派生自非 COM 可见 class 'System.Windows.Window',QueryInterface 调用将失败。这样做是为了防止非 COM 可见基 class 受到 COM 版本控制规则的约束。'
有什么办法可以解决吗?或者它不能在 WebBrowser 控件和 WPF 中完成?
我们需要创建一个单独的 class 并将其用于脚本
using System.Windows;
using System.Security.Permissions;
using System.Windows.Controls;
using System;
namespace WpfApp2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class ObjectForScriptingHelper
{
public void Test()
{
MessageBox.Show("xxxxx");
}
}
public MainWindow()
{
InitializeComponent();
button1.Content = "call script code from client code";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//webBrowser1.AllowWebBrowserDrop = false;
//webBrowser1.IsWebBrowserContextMenuEnabled = false;
//webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = new ObjectForScriptingHelper();
// Uncomment the following line when you are finished debugging.
//webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(@"C:\temp\WpfApp2\WpfApp2\HTMLPage1.html");
}
private void Button1_Click_1(object sender, RoutedEventArgs e)
{
webBrowser1.InvokeScript("test",
new String[] { "called from client code" });
}
}
}
我正在尝试从示例 https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.objectforscripting?redirectedfrom=MSDN&view=netframework-4.8#System_Windows_Forms_WebBrowser_ObjectForScripting 中给出的 WebBrowser 控件调用 WPF 客户端代码。 link 中提供的示例适用于 Windows 表单。我正在尝试在 WPF 中做类似的事情。但是,我收到以下错误。
托管调试助手 'NonComVisibleBaseClass' : '进行了 QueryInterface 调用,请求 COM 可见托管的默认 IDispatch 接口 class 'WpfApp2.MainWindow'。但是,由于此 class 没有明确的默认接口并且派生自非 COM 可见 class 'System.Windows.Window',QueryInterface 调用将失败。这样做是为了防止非 COM 可见基 class 受到 COM 版本控制规则的约束。'
有什么办法可以解决吗?或者它不能在 WebBrowser 控件和 WPF 中完成?
我们需要创建一个单独的 class 并将其用于脚本
using System.Windows;
using System.Security.Permissions;
using System.Windows.Controls;
using System;
namespace WpfApp2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class ObjectForScriptingHelper
{
public void Test()
{
MessageBox.Show("xxxxx");
}
}
public MainWindow()
{
InitializeComponent();
button1.Content = "call script code from client code";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//webBrowser1.AllowWebBrowserDrop = false;
//webBrowser1.IsWebBrowserContextMenuEnabled = false;
//webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = new ObjectForScriptingHelper();
// Uncomment the following line when you are finished debugging.
//webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(@"C:\temp\WpfApp2\WpfApp2\HTMLPage1.html");
}
private void Button1_Click_1(object sender, RoutedEventArgs e)
{
webBrowser1.InvokeScript("test",
new String[] { "called from client code" });
}
}
}