如何在鼠标点击期间更改MSHTML中插入符号的位置?

时间:2009-09-02 14:57:46

标签: c# mshtml

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

在加载到IE控件中的HTML中使用jscript。如果您不熟悉HTML和jscript 非常好,您会发现此任务非常痛苦

当我尝试这样做时,请查看这些问题。

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

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

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

快速google发现。

答案 1 :(得分:2)

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

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

了解Spy ++,了解MSHTML控件中不同窗口之间发送的事件,以获得其他理想。 MSHTML控件就像没有其他winforms控件一样,你必须回到你在C和Win32编程时使用的所有技巧。

答案 2 :(得分:1)

也许mouseDown mouseUp和mouseClick有单独的事件。

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

答案 3 :(得分:1)

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

(MSHTML有一些接口可以查找dom项目和调用方法。抱歉,我不记得有关如何执行此操作的详细信息)

答案 4 :(得分:0)

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