问题标签 [bho]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
169 浏览

c# - 当我的电脑上有几个时,如何确定我的产品的哪些 .net 程序集已注册?

我有我在我的机器上工作的软件产品的各种版本的代码。该产品包括一个或多个为 com interop 注册的程序集。如何确定当前注册的是哪一个?

0 投票
1 回答
1545 浏览

internet-explorer - IE 自动化:如何确定用户启动的导航何时发生/已经发生?

我有一个 Internet Explorer BHO(在 c# .net 中)并且想要识别用户何时启动导航或用户启动导航何时完成。用户发起我的意思是点击一个链接或类似的动作。特别是如果正在加载的文档中有多个框架,我想将它们视为一个“导航”,但我想不出任何简单的方法来做到这一点。我知道 BeforeNavigate2 和 DocumentComplete 事件,但是看不到任何方法来区分用户单击链接时触发的 BeforeNavigate/DocumentComplete 和由于框架正在加载而触发。

我在想的一种可能的解决方案是,顶部框架的 BeforeNavigate2 总是在内部框架之前被触发(显然),然后子框架的 DocumentComplete 在顶部的 DocumentComplete 之前被调用,它总是最后调用. 因此,例如,我可以在 BeforeNavigates 中增加一个计数器并在 DocumentComplete 中减少它,只有当它为 0 时,它才是用户启动的导航。

但我不确定我是否可以依靠这个,或者是否有更好的方法来做到这一点。例如,如果用户在其中一帧后按下 ESC 但并非所有帧都完成加载会发生什么情况:是否曾调用顶部帧的 DocumentComplete?

有什么建议么?

0 投票
4 回答
8432 浏览

c# - Form.ShowDialog(IWin32Window) 应该与任何窗口句柄一起使用吗?

使用时System.Windows.Forms.ShowDialog(IWin32Window),我是否应该能够传入IWin32Window代表任何窗口句柄并使其相对于该窗口成为模态?

作为 Internet Explorer 7 扩展的一部分,我正在尝试打开与 Internet Explorer 选项卡相关的窗口模式。它不是当前选择的选项卡,但我可以确定选项卡的 hwnd。但是,当我将它传递给 ShowDialog 时,我的表单会显示出来,但它对于任何东西都不是模态的:我仍然可以在 Internet Explorer 中执行操作,包括在应该是所有者的选项卡中。我的表单显示在 Internet Explorer 窗口上方并停留在顶部,因此它不像只是作为普通表单打开,但它不是正确的模式。

使用Spy++,我可以找到我的表单并且它的所有者句柄设置正确。

这是否意味着出现问题,或者我做错了什么?如何使我的表单正确模态?

仅供参考,我正在使用这个包装类来创建IWin32Window一个hwnd(感谢Ryan!):

更新:使用 Internet Explorer 7 和 .NET 2.0

更新:使用 Spy++ 及其公开的句柄进行更多尝试,我发现如果我使用不同的,hwnd那么我可以使我的窗口模态到选项卡:

我正在使用IWebBrowser2.HWND dochwnd建议的选项卡,它在 Spy++ 中显示为 class 。它有一个 class 的孩子,它有一个 Internet_Explorer_Server 的孩子。如果我使用 的那么它可以正常工作,例如,当我用鼠标单击其他选项卡时,Internet Explorer 会正常反应。当我在感兴趣的选项卡上单击鼠标时,它会播放 windows d'oh 声音并且不执行任何操作。TabWindowClassShell DocObject ViewhwndInternet Explorer_Server

我还不知道如何以编程方式获取 Internet_Explorer_Server hwnd,但它应该是可能的。

此外,就其价值而言,在使用其他窗口句柄时,我通常能够使我的表单成为其他应用程序和对话框的模态。所以我想我的问题的答案是“很多但不是所有的句柄”......可能它取决于应用程序?

更新:另一个旁注:我想让我的表单模式化到选项卡而不是整个窗口的最初原因是,当MessageBox从我的表单打开一个,将表单作为所有者传递时,MessageBox不会总是在我的表单顶部打开. 如果一个新的 Internet Explorer 选项卡刚刚打开但未处于活动状态,则该MessageBox选项卡将被隐藏并且该选项卡将开始闪烁。但是,由于 Internet Explorer 在我的表单打开模式下被禁用,因此无法切换到该选项卡,因此 Internet Explorer 将被冻结。我认为将我的表单模式打开到选项卡可以解决这个问题,但我发现另一个解决方案是避免使用MessageBox:如果我使用第二个表单并且ShowDialog(this)从我的第一个表单开始,那么第二个表单正确打开到前面。所以它似乎Form.ShowDialog()MessageBox.Show()在某些情况下。模态对话框和消息框问题中的更多讨论。

0 投票
2 回答
2937 浏览

c# - 设置项目 COM 注册

我有一个使用 COM 互操作用 C#/.NET 2.0 编写的 IE BHO(工具栏)。我正在使用 Visual Studio 2005 使用安装项目为我的工具栏生成一个 MSI 安装程序。

在我的程序集中,我有使用ComRegisterFunctionAttribute的 COM 注册/取消注册方法,它设置注册表项,为 IE 提供有关我的工具栏的一些关键信息(如工具栏的名称)。在我的设置项目中,我使用vsdrpCOMRelativePath属性为 COM 注册我的 dll (参见下面的代码)。

当我使用 MSI 安装时,工具栏功能正常,但我有一个烦人的问题:当我启动 IE 并选择我的工具栏时,它出现在有效工具栏列表中,但它具有完全限定的类名:“ MyToolbar .IEHelperToolbar ”而不是普通名称:“ IEHelperToolbar

似乎安装项目生成的 MSI 没有调用我在程序集中定义的自定义注册方法。我得出这个结论是因为如果我使用 regasm.exe 注册 dll,IE 会显示正确的名称。

我应该在我的安装项目中使用不同的注册设置,还是应该遵循这篇文章中的方法:,或者我应该放弃 VS2005 安装项目并转到 WIX 之类的东西,还是我离基地很远?

这是我的注册/注销功能:

0 投票
2 回答
6924 浏览

debugging - 为什么 DebugView 不显示调试消息而 Visual Studio 显示

我正在开发一个在 Internet Explorer 中运行的浏览器助手对象。我正在编写调试消息,ATLTRACE("...");当 Visual Studio 附加到iexplore.exe进程时,这些看起来很好,但这对于快速测试来说很慢。DebugView 没有从我的 BHO 中捕获任何内容。

为什么 DebugView 不显示 BHO 调试消息?是否与以低完整性级别运行的 Internet Explorer 有关?

0 投票
1 回答
339 浏览

c# - 如何访问 Internet Explorer 的用户字体设置?

我想在用 C# 编写的浏览器帮助器对象中访问 Internet Explorer 用户设置的字体,尤其是字体系列。

我查看了 SHDocVw.WebBrowser 和 IHTMLDocument(to 5) 但我没有看到我正在寻找或缺少的属性。

BHO 适用于 Internet Explorer 7。

非常感谢!

编辑:理查德问我为什么需要这些信息:如果系统上未安装 HTML 文档或 CSS 给定的字体系列,则使用您可以在 IE7 设置中调整的字体系列。我需要这个基于应用程序的字体系列,它用于在最后一个实例中呈现文本(如果所有其他信息都失败)。

0 投票
3 回答
4037 浏览

dll - 如何在 DLL 中使用 WTL?

我正在尝试在进程内 COM 服务器 DLL(IE BHO)中使用 WTL,但我正在努力使用 _Module。

我的 DLL 需求CMyModule来自CAtlDllModuleT<>

但这与大多数 WTL 示例相冲突,后者需要以下内容stdafx.h

无论我采用哪种方式,我(不出所料)都会遇到编译错误。CMyModule源自CAppModuleborks on_Module.DllUnregisterServer()等。CMyModule源自CAtlDllModuleT<>borks on 代码,例如_Module.GetMessageLoop().

关于 WTL 应该如何在 DLL 中工作的任何好的参考资料?谷歌发现很多问题,但答案很少。

0 投票
1 回答
982 浏览

internet-explorer - BHO - 从工作线程附加事件处理程序

在 DISPID_DOCUMENTCOMPLETE 上,如果我从工作线程为 DOM 中的特定元素附加 onclick 处理程序,那么在单击它时不会触发该事件,可能是什么原因?如果我从主线程附加事件处理程序,这工作正常,但我想异步做事。

我正在使用 CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 在线程之间传递 IID_IWebBrowser2 指针。

0 投票
1 回答
2128 浏览

multithreading - C# IE BHO:在保持同一个线程的同时异步工作吗?

我有一个正在用 C# 开发的 IE BHO。它应该等待用户做一些事情,联系我们的服务器并下载一些数据,然后用结果改变当前加载网页的 DOM。

我遇到了一些与 COM 划分和线程规则相关的看似无法克服的问题——即,我似乎无法在当前线程之外访问 IE DOMDocument,而且我想不出任何方法可以在不锁定的情况下异步运行某些东西启动 IE 直到完成。

我的第一次尝试是让后台服务器通信以事件驱动的方式完成它的工作:我的程序将从 mshtml 事件(例如,BeforeNaviagate2 或 DocumentComplete)中启动通信,并从单独的事件处理程序中发布结果由服务器通信对象在完成其工作时触发。

该技术在我拼凑在一起的快速模拟器中运行良好(只是一个带有 WebBrowser 控件的简单应用程序),但在 IE 中它会引发 COM 异常,因为我试图通过单独的线程更改页面 DOM。

因此,我尝试将所有内容保留在同一个函数中,并让我的代码等待服务器通信对象使用 while 循环完成其工作,如下所示:

这种方法的问题在于,当代码保留在原始线程中时,它会与它触发的 IE 进程同步执行(在 IE8 中,它是每个选项卡一个进程 - 就像 Google Chrome 一样 - 似乎)......因此锁定IE 界面,直到我的服务器通信完成。

最初我想在 URL 可用时立即开始处理(通过 NavigationComplete2 事件),但我发现如果我的服务器通信在用户页面加载之前完成,等待 <body> 标记变得可用也会锁定 IE - 抛出它进入一个无限循环,而我的代码等待 HTML 正文,而页面被阻止更新自身做上述循环。

我考虑过将所有这些都移到实际用户页面的 javascript 中,但似乎这样做我打开了一罐蠕虫来解决 XSS 安全问题。

所以...我的问题是这样的:是否可以在 C# IE BHO 中异步运行代码,同时仍然能够操作用户的页面 DOM?我问了一些朋友,大多数人告诉我这不太可能。我还是 COM 和 C# 的新手,来自 C/VB.net/JS/AS。

谢谢!

-汤姆

0 投票
3 回答
3077 浏览

windows - 使用 Browser Helper 对象修改 HTTP 请求和响应

我想使用 Internet Explorer 浏览器帮助程序对象修改 HTTP 请求标头。我基本上需要为每个请求更改一些标头,然后在响应返回浏览器之前对其进行修改。

我尝试使用 OnNavigate2 事件,但这些事件甚至无法让您访问所有标题。

我尝试制作一个异步可插入协议,但是我真的无法访问默认的 HTTP 实现,也无法覆盖默认的 HTTP 请求。

你知道这应该怎么做吗?我更喜欢 C#,但必要时可以使用 C++。