问题标签 [mshtml]

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 回答
725 浏览

mshtml - 嵌入式 MSHTML:鼠标滚轮被忽略

在我的 VC++ 应用程序中,我有一个嵌入式浏览器 (MSHTML)。它工作正常并正确处理鼠标(例如,单击和选择处理正常)。但是,嵌入式浏览器上的鼠标滚轮旋转没有任何效果。这是我的问题。

我对 MSHTML 嵌入的内部结构和一般的 OLE 不是很熟悉。这是一个 wxWidgets 应用程序(wxWidgets 是一个 C++ GUI 库),我正在使用它的 IEHTMLWin 组件(它承载一个 MSHTML 控件并将其包装在 wxWindow 界面中)。但是,我确实有源代码,并且愿意进行一些调试。

忘记 wxWidgets 并纯粹谈论 OLE 和 MSHTML,什么是开始寻找问题原因的正确位置?我尝试天真地搜索“mshtml 鼠标事件”或“mshtml 滚轮”的变体,但没有给出任何好的指示。

如果你想看一下 IEHTMLWin 的代码,可以在这里浏览。iehtmlwin.c 文件(1,5 k 行)包含所有与 OLE 相关的代码,并实现了托管 Web 浏览器控件所需的所有接口。值得注意的是,鼠标事件根本不会进入包含的 wxWindow(永远不会调用 OnMouse)。

{UPD} mshtml 版本:6.00.2900.3314。承载此控件的其他应用程序(包括 IE)支持滚轮。{/UPD}


jdigital 提示(关于 winspector)非常有帮助。经过一些消息嗅探,我意识到问题与焦点有关。单击浏览器控件以某种方式不会将焦点设置在浏览器控件上(与 RichEdit 不同),并且不会将 WM_MOUSEWHEEL 发送到那里。所以新的问题是设置焦点。

0 投票
1 回答
2110 浏览

mshtml - 将焦点设置到嵌入式 MSHTML

在我的应用程序中,我有一个嵌入式 MSHTML 控件。问题是我无法将焦点设置在此控件上。我可以单击、选择、按下按钮等,但结果是它不接受键盘输入和鼠标滚轮通知。即使左键单击控件也不会设置焦点。(这个问题与这个问题有关。

最终,我尝试了 4 种方法。(为简洁起见,此处省略了错误处理。)首先是向控件发送 WM_SETFOCUS。

使用 Winspector,我确保消息通过控件的窗口,但它似乎忽略了它们。

二是调用IHtmlWindow2的focus()方法。

这一次,我从 focus() 得到 E_FAIL。

MSDN 说,当文档尚未加载时,调用可能会失败,但 pHTMLDoc2->get_readyState() 返回“完成”。所以事实并非如此。

第三个是做 UIACTIVATE 动词。

这似乎一无所获。

第四种是调用IHtmlDocument4 的focus()。

什么也没做。

我已经花了一整天的时间,现在已经牢记谷歌的链接 :) 希望专家的提示。

0 投票
2 回答
713 浏览

c# - IE 的 getBoundingClientRect 在浏览器中给出的答案与在 windows.forms.webbrowser 中不同 - 为什么?

取以下html

将其加载到浏览器中并单击任意位置 - 你会得到 210 这是#Body div 的左值

但是,在带有 webbrowser 控件的 win 表单上,导航到相同的 html

再次单击,您将获得 10。

为什么……为什么……为什么?

0 投票
3 回答
7762 浏览

parsing - 如何使用 mshtml 获取框架的内容?

这是问题:

我在 IE 中有一个钩子,它对WebBrowser.OnNavigateComplete2事件做出反应以解析文档的内容以获得一些精确的信息。

该文档包含框架,因此我查看了HTMLDocument.frames. 对于每一个,我都会查看 document.body.outerHTML 属性以检查内容。

问题是,我正在寻找的字符串永远不会在那里显示,而它显示在结局页面中。那么,我是不是找错地方了?如果它在页面完全加载时显示,那么它会在某个时候下载,对吗?但我应该看哪个对象?

顺便说一句,我不知道这是否重要,但我正在搜索的页面来自 ASP.NET 应用程序。

感谢您的帮助。


@rams 每个页面都会多次启动此事件,所以我认为这是每次加载框架时,即使我没有赶上我正在寻找的那个。如果没有,捕获帧内容的事件是什么?

我想要做的是在精确的框架上检测一些精确的信息,然后保存它。稍后,某个用户操作触发了一个网页加载,我需要从解析框架中获得的信息。

0 投票
2 回答
1365 浏览

c# - 无法设置 IHTMLEventObj2::fromElement

我正在尝试在 Internet Explorer 扩展中生成合成 Javascript 事件,但我无法让 fromElement 属性保持不变。这是我的代码的摘录:

我在这里做错了什么?eObj.fromElement 应该等于 from,但它似乎没有被设置。

0 投票
1 回答
2608 浏览

c# - 如何将 .NET 委托附加到 mshtml 事件?

我正在开发 Internet Explorer 的扩展 (BHO),并且无法将 .NET 委托附加到 mshtml 对象以捕获 DOM 事件。

我已经尝试使用由 IHTMLElementEvents2_Event, ... 接口发布的事件,并且它有效,但前提是我为要捕获其事件的 DOM 元素指定了正确的类型。我还需要在代码中指定元素的类型,并且这种技术不允许捕获自定义 DOM 事件。

我也尝试过使用HtmlEventProxy 类,它通过 IHTMLElement2.attachEvent 方法将 IDispatch 对象附加到 DOM 元素,但这对我来说根本不起作用。当我尝试访问该线程中描述的事件对象时,在访问 DOM 元素的文档属性时遇到了挂起。

那么如何在不需要特殊情况下每种元素和每种事件的情况下将事件处理程序附加到 DOM 元素?

谢谢。

0 投票
1 回答
2009 浏览

c# - 为什么 EventInfo.RemoveEventHandler 会抛出 NullReferenceException?

我有一些代码使用反射在 Internet Explorer BHO 中的 MSHTML 对象上安装 .NET 事件处理程序,它似乎工作正常。但是,当我尝试删除事件处理程序时,我遇到了麻烦。

事件处理程序安装和删除的代码如下所示:

调用InstallEventHandler工作正常,Handler然后在浏览器中触发事件时调用。当我RemoveEventHandler使用与调用相同的参数进行InstallEventHandler调用时,最后一行抛出 a TargetInvocationException,内部异常为NullReferenceException。我无法弄清楚我在这里做错了什么,堆栈跟踪也没有多大帮助。

编辑:我已经通过调试器中的代码,我直接引用的对象变量都不是空的。

我也尝试在 InstallHandler 方法中调用AddEventHandler和调用RemoveEventHandler,并且工作正常。

堆栈跟踪如下:

这可能是什么原因造成的,我该如何解决?

0 投票
4 回答
1110 浏览

html - 减少生成的 HTML 大小的工具

我正在使用谷歌文档,我们使用的一些模板是使用 MS-Office 创建的。
生成的 HTML 又胖又丑,而且 google 上每个文档 500KB 的限制使得一些清理工作是强制性的。我能够找到多余的“样式”属性并将它们移动到某个 CSS 类,并将最多余的类名称重命名为较短的名称,这使我节省了大约 50% 的原始大小。
您是否知道一些现有的工具/脚本/lib 可以为我完成这项痛苦的工作,或者至少帮助我编写这个神奇的工具?

提前致谢 !

编辑:我尝试了 tidy、demronizer 和“手动重写”:
- 输入:140Kb
- Tidy'ed: 110Kb
- Demoronized:135Kb

所以我最喜欢的答案是“重写它!”

谢谢 !

0 投票
1 回答
1597 浏览

c++ - 在 C++ 中使用 MSHTML 作为 GUI,是否有教程?

我想将我的应用程序迁移到对 GUI 使用 MHTML,因为不用每次都重写 C++ 来试验布局会更容易。

不幸的是,我发现的不是我需要的,它们是:

  • 从内存中输入 HTML
  • 在我的 C++ 代码中接收诸如 onclick 等事件
  • 通过 DOM 对其进行操作,例如,设置特定元素的 innerHtml
0 投票
3 回答
2897 浏览

.net - .NET mshtml:如何传递 BSTR SAFEARRAY?

Microsoft.mshtml.dll 程序集中的 mshtml.HTMLDocumentClass 类有一个方法:

暂时避免真正的问题,您将使用什么代码来调用write()?你会使用:

或者你会使用:

因为这两个都抛出异常。(类型不匹配。0x80020005)

HTMLDocumentClass.write方法实际上来自IHTMLDocument2接口,它被记录为:

IHTMLDocument2::write 方法

将一个或多个 HTML 表达式写入指定窗口中的文档。

句法

参数

psarray

所以实际上 write 方法需要一个指向 SAFEARRAY 的指针,即使 Microsoft 的Microsoft.mshtml互操作程序集将write方法定义为采用常规数组:

忽略 mshtml 互操作声明,我必须构造一个SAFEARRAY对象(对象数组),用 BSTR 字符串(字符串)填充它,并将其填充到必须是对象数组的参数中。


注意:我不确定params关键字的含义。它用于指示可变数量的参数。

这是否意味着它可以采用多个数组参数?

还是 object[] 是传递多个参数的方法,并且您必须逐字创建一个数组?

或者 array[] 只是一个诱饵,你真的通过了:


当我最初从本机 Win32 应用程序中使用此代码时,BSTR 被放置在 SAFEARRAY 中。在基于 IDispatch 的自动化中,一切都在数组中。在这种情况下,后期绑定代码:

由编译器转换为 SAFEARRAY,其中第零个元素包含 BSTR 字符串(这是一个长度前缀的 unicode 字符串)。

我的问题变成了尝试构建 SAFEARRAY、将字符串转换为 BSTR、将 BSTR 放入 SAFEARRAY 的第零个元素以及将包含 SAFEARRAY 的变量传递给仅接受对象数组(object [ ])。

这是真正的问题:如何创建 BSTR SAFEARRAY?


微软.mshtml

C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll