1

我在应用程序中嵌入了一个基于 MSHTML 的控件,并且ContentEditable模式用于编辑其中的文档。HTML 文档的正文最初包含以下几行:

<div></div>
<div id="signature"></div>

插入符号位于文档的开头,即第一个 DIV 元素内。现在,当用户在控件内最后一行下方的位置单击鼠标时,插入符号将移动到第二个 DIV 元素中,因为它是最接近用户单击点的元素。

我想在鼠标单击时将指针移动到第一个 DIV 的末尾。现在我有代码来计算插入符号的预期位置为IMarkupPointerIDisplayPointer。我需要知道的是在哪里拦截 MSHTML 事件管道以执行实际的插入符号移动。

我编写了实现IHTMLEditDesigner插入符号并将其移动IHTMLCaret.MoveCaretToPointer到预期位置的代码。问题是,无论我在哪里截获事件(PreHandleEvent、PostHandleEvent 或 PostEditorEventNotify),插入符号位置最终都会在单击时恢复为默认位置(但如果我按住鼠标左键一会儿或者如果我用鼠标右键单击)。

4

5 回答 5

3

在加载到 IE 控件的 HTML 中使用 jscript。如果您不太了解 HTML 和 jscript,您会发现这项任务非常痛苦

当我尝试这样做时,请参阅这些问题以了解我的经验。

我还有很多其他问题,包括必须在 jscript 中编写调整大小逻辑以使 HTML 编辑器与 WinForm 表单一起调整大小,并且必须将默认表单/控制颜色传递给 HTML 编辑器,以便它看起来写然后用户改变Windows 上的配色方案。

更好的是找到一个 HTML 编辑器并将其加载到 IE 控件中,您仍然必须自己使用标准窗口颜色等进行编码。

您还可以使用第 3 方 winforms HTML 编辑器。如果可能的话,我认为您应该购买一个解决方案,因为 ContentEditable 在现实生活中要困难得多。

一个快速的谷歌发现。

于 2009-09-10T09:49:24.327 回答
2

您是否尝试过使用超时为 0 的 winforms 计时器?

  • 当您获得鼠标按下事件时,启动计时器。
  • 然后 MSHTML 控件将处理该事件
  • 然后您将返回到 Windows 消息循环
  • 消息队列中的所有其他消息将在计时器之前处理
  • 希望到现在 MSHTML 已经在单击时设置了默认插入符号位置
  • 然后,当计时器触发时,您可以自己移动插入符号的位置

使用 Spy++ 查看 MSHTML 控件中不同窗口之间发送的事件以获得其他理想。MSHTML 控件与其他 Winforms 控件不同,您必须回到 C 和 Win32 编程时代使用的所有技巧。

于 2009-09-11T10:12:24.867 回答
1

mouseDown mouseUp 和 mouseClick 可能有单独的事件。

您拦截 mouseClick 但默认行为在 mouseUp 上执行。

于 2009-09-09T16:26:27.380 回答
1

您是否通过为它找到 dom 项并调用 setFocus(或其他任何名称)dom 方法将“焦点”设置到第一个 div?插入符号应该移动到 fosus 所在的位置。

(MSHTML 公开了一些接口来查找 dom 项并在其上调用方法。抱歉,我不记得如何执行此操作的详细信息)

于 2009-09-11T14:33:32.133 回答
0

我相信您需要更改 SelectStart 属性并保留 SelectionLength = 0。这会将插入符号移动到新位置。

于 2009-09-12T01:36:40.290 回答