C#Webbrowser以编程方式关闭JS确认框

时间:2015-06-26 06:16:24

标签: javascript c# .net winforms webbrowser-control

在使用webbrowser控件时,我需要以编程方式自动关闭javascript确认框。

我使用了以下user32.dll方法,它在基于英语的操作系统上运行良好。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

但是如果计算机运行的是非英语操作系统,那么它就不能正常使用" OK"作为上述方法调用中的文本。

我认为可以使用的一种方法是我应该检测操作系统语言,然后使用已翻译的"确定"使用上述方法的文本。 在这里,我的问题是我可以更改当前线程的语言以及webbrowser控件,以便它显示英语语言的确认框吗?这样,在我看来,这将是简单快捷的解决方案。

请建议您的解决方案。提前谢谢。

我在我的代码中使用了类似的方法,但这些解决方案仅适用于英语软件。我实际上正在寻找一些可以在非英语操作系统上运行的通用解决方案。

1 个答案:

答案 0 :(得分:1)

一个可能的解决方案是注入并立即调用一个劫持原始确认函数的Javascript函数:

app/assets/images

这是使用标准WPF WebBrowser控件的WPF应用程序中的一个示例,我非常确信我在这里所做的一切都可以调整为适合WinForm控件(因为底层的ActiveX是相同的)。 我有一个UserControl充当WebBrowser的适配器,这里是XAML:

function hijackConfirm(){
    alert('yep!');
    window.oldConfirm = window.confirm;
    window.confirm = function(){ return true };
}

首先,在<UserControl x:Class="WebBrowserExample.WebBrowserAdapter" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <WebBrowser x:Name="WebBrowserControl"></WebBrowser> </Grid> </UserControl> 类中,您需要一种方法在当前HTML文档中注入javascript函数:

WebBrowserAdapter

然后在需要时,只要文档加载完毕,就会调用public void InjectScript(String scriptText) { HTMLDocument htmlDocument = (HTMLDocument)WebBrowserControl.Document; var headElements = htmlDocument.getElementsByTagName("head"); if (headElements.length == 0) { throw new IndexOutOfRangeException("No element with tag 'head' has been found in the document"); } var headElement = headElements.item(0); IHTMLScriptElement script = (IHTMLScriptElement)htmlDocument.createElement("script"); script.text = scriptText; headElement.AppendChild(script); }

InjectScript

在这里,我导航到http://localhost:9080/console/page.html,这是我系统上托管的测试页面。这在这个简单的场景中效果很好。如果您发现这可能适用于您,您可能需要稍微调整一下代码。为了编译代码,您必须在项目引用中添加void WebBrowserAdapter_Loaded(object sender, RoutedEventArgs e) { WebBrowserControl.LoadCompleted += WebBrowserControl_LoadCompleted; WebBrowserControl.Navigate("http://localhost:9080/console/page.html"); } void WebBrowserControl_LoadCompleted(object sender, NavigationEventArgs e) { //HookHTMLElements(); String script = @" function hijackConfirm(){ alert('yep!'); window.oldConfirm = window.confirm; window.confirm = function(){ return true }; }"; InjectScript(script); WebBrowserControl.InvokeScript("hijackConfirm"); }

编辑:WinForm版本

要使其正常工作,您必须在应用程序中使用IE 11引擎。按照here设置的说明进行设置

我刚尝试了一个WinForm版本,它可以进行一些小改动。以下是具有WebBrowser控件作为其子项之一的表单的代码:

Microsoft.mshtml