如何以编程方式检测是不是在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件)

Posted

技术标签:

【中文标题】如何以编程方式检测是不是在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件)【英文标题】:How can you programmatically detect if javascript is enabled/disabled in a Windows Desktop Application? (WebBrowser Control)如何以编程方式检测是否在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件) 【发布时间】:2012-08-23 15:37:02 【问题描述】:

我有一个将 html 写入 .NET winforms 应用程序中的 WebBrowser 控件的应用程序。

我想以某种方式检测 Internet 设置是否禁用了 javascript(或 Active Scripting)。

我猜你需要使用 WMI 之类的东西来查询 IE 安全设​​置。

编辑#1:重要的是我知道在显示 HTML 之前是否启用了 javascript,因此修改 DOM 以显示警告或使用标签的解决方案不适用于我的特定情况。在我的情况下,如果 javascript 不可用,我将在本机 RichTextBox 中显示内容,并且我还想向服务器应用程序报告是否启用了 JS,这样我就可以告诉发送警报的管理员 5% 或 75%的用户是否启用了 JS。

【问题讨论】:

希望你已经检查过了? - social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/… @blak3r 看看我的回答,它会解决你的问题。 @Erx_VB.NExT.Coder 感谢您的好回答。不过,您迟到了 5 个小时:/ 我发布的答案采用了与您概述的检查注册表相同的方法。为完整起见 +1 了您的答案。 @blak3r 很高兴它为您工作,请记住,通过注册,您无法动态更改 JS 开/关状态,即:每当您更改时,您需要重新启动应用程序或执行正确卸载和重新加载进出内存(即WB控件)。但如果这对你来说不是问题,那么一切都是花花公子:) @Erx_VB.NExT.Coder 是的。我没有修改用户的计算机。那是邪恶的。只想检测或不检测。 【参考方案1】:

感谢@Kickaha 的建议。这是一个检查注册表以查看它是否已设置的简单方法。可能在某些情况下这可能会引发异常,因此请务必处理它们。

    const string DWORD_FOR_ACTIVE_SCRIPTING = "1400";
    const string VALUE_FOR_DISABLED = "3";
    const string VALUE_FOR_ENABLED = "0";

    public static bool IsJavascriptEnabled( )
    
        bool retVal = true;
        //get the registry key for Zone 3(Internet Zone)
        Microsoft.Win32.RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3", true);

        if (key != null)
        
            Object value = key.GetValue(DWORD_FOR_ACTIVE_SCRIPTING, VALUE_FOR_ENABLED);
            if( value.ToString().Equals(VALUE_FOR_DISABLED) )
            
                retVal = false;
            
        
        return retVal;
    

注意:为了保持此代码示例简短(并且因为我只关心 Internet 区域)- 此方法仅检查 Internet 区域。您可以修改 OpenSubKey 行末尾的 3 以更改区域。

【讨论】:

【参考方案2】:

如果您在弹出弹出窗口时遇到问题,我已经为您提供了一个解决方案,并且如果您想在客户端机器上禁用/启用 javascript(或者甚至只是读取/查询它是否已启用/禁用)我也为您提供了该答案,我们开始吧:

您要禁用哪个弹出消息?如果是警报消息,试试这个,显然根据您的特定需求解析窗口或框架对象,我只是假设***文档,但如果您需要 iframe,您可以使用 window.frames(0) 访问它。对于第一帧等等...(关于 JavaScript 部分)...这里有一些代码,假设 WB 是您的网络浏览器控件...

WB.Document.parentWindow.execScript "window.alert = function () ;", "JScript"

您必须在整个页面加载完成后才运行上述代码,我知道这很难做到(并且尚未发布完整证明版本)但是我一直在这样做(完整证明)一段时间以来,如果您阅读我之前标记为“webbrowser”和“webbrowser-control”的一些答案,您可以收集有关如何准确执行此操作的提示,但如果您想取消.confirm JavaScript 消息,只需将 window.alert 替换为 window.confirm(当然,使用正确的对象限定您的 window.object 以到达您正在使用的文档层次结构)。您还可以使用上述技术禁用 .print 方法以及新的 IE9 .prompt 方法。

如果您想完全禁用 JavaScript,您可以使用注册表来执行此操作,并且您必须在 webbrowser 控件加载到内存之前更改注册表,并且每次更改(打开和关闭)时都必须重新加载webbrowser 控制进出内存(或者只是重新启动您的应用程序)。

注册表键是\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\ - 键名是1400,禁用它的值为3,启用它的值为0。

当然,因为 Zones 键下有 5 个区域,所以您需要为活动区域或所有区域更改它以确保确定。但是,如果您只想抑制 js 对话框弹出消息,则实际上不需要这样做。

让我知道你的情况,如果我能提供进一步的帮助。

【讨论】:

【参考方案3】:

这里有一个建议 - 默认将警告编码到您的网页中。创建一个在页面加载时运行的 javascript,它会删除该元素。当 javascript 不允许运行时,警告就会出现。

很久没有编写客户端 HTML javascript 来与 DOM 交互了,所以我可能有点过时了。即您将需要修复细节,但我希望我能理解总体思路。

<script>
document.getElemntByID("noJavascriptWarning").innerHTML="";
</script>

在你的 HTML 正文中

<DIV id="noJavascriptWarning" name="noJavaScriptWarning">Please enable Javascript</DIV>

【讨论】:

这对某些人来说是个好建议。但是,我别有用心,要求我知道是否在显示 HTML 之前启用了 javascript。我将 A) 想将此报告回服务器以警告管理员...并且 B) 如果未启用 javascript,我将改为以本机形式显示内容。 我在 SO 的其他地方发现了这条关于设置 cookie 的评论,这很有意义。我正在考虑一个隐藏 iFrame 的人为解决方案,您可以从服务器加载其他页面(它允许您以查询字符串将信息发送回服务器......如果我没记错的话......)“没有t 执行服务器端 JavaScript 检测的好方法。相反,使用 JavaScript 设置 cookie,然后在后续页面查看时使用服务器端脚本测试该 cookie;适当地传递内容。这将花费你一个初始页面刷新或重定向.. 是的,在处理网页时无法进行服务器端 javascript 验证。我有一个不同的应用程序,我在其中向用户显示消息。由于我有一个桌面应用程序,我应该能够检测到这一点并告诉服务器。您建议的使用 cookie 的解决方案是另一个很好的建议,但似乎是一种更难的方法。另外,它不会告诉我的桌面应用程序是否启用了 JavaScript,而无需向服务器 isJavascriptEnabled 执行单独的 Web 请求?在 webcontrol 之外的东西中。 好的,既然你有一个应用程序,请尝试使用注册表pratibha02pandey.blogspot.com/2010/08/…

以上是关于如何以编程方式检测是不是在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件)的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将文件上传到 Windows Server 2003 远程桌面

如何以编程方式检测Windows Phone 8.1操作系统版本?

如何以编程方式更改我的 Windows 桌面墙纸?

C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是不是处于活动状态 [重复]

Windows 7 以编程方式登录

如何以编程方式在 Windows 8 和 Windows 10 桌面登录屏幕上显示状态栏? [关闭]