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

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

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

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

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

有帮助吗?

解决方案

在加载到 IE 控件中的 HTML 中使用 jscript。如果您不了解 HTML 和 jscript 很好 你会发现这个任务非常 痛苦.

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

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

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

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

谷歌很快就找到了。

其他提示

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

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

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

也许有用于鼠标按下mouseup和点击鼠标独立的事件。

您点击鼠标拦截,但默认行为大干快上mouseUp事件执行。

让你绑通过查找DOM项目它,并调用的setFocus(或任何它被称为)DOM方法设置“焦点访谈”的第一个div?插入符应该移动到其中fosus是

(有迹象表明,暴露MSHTML上找到他们的DOM项目和调用方法的接口。对不起,我不记得如何做到这一点的细节)

我相信你需要改变选择开始财产并离开SelectionLength = 0这将插入符移动到新的位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top