ms-word 对象模型:自定义拼写检查下划线

ms-word object model: custom spellchecking underlines

在制作 MS Word 附加拼写检查器时,我遇到了“下划线”的问题。我可以使用 Word 对象模型的格式化功能来为拼写错误的单词着色或在它们下划线,就像用户使用 U 按钮的方式一样,但这与不显示的本机 ms-word 卷曲下划线不同如果您将文本复制粘贴到其他地方,则不会打印或保存,也不会显示在撤消操作中。一直在找怎么弄,可是大家都说不可能。

有一个叫做 Grammarly 的英语拼写检查器,他们确实有一个 ms-word 插件,他们以某种方式在拼写错误的单词下划线(虽然它不是卷曲的,只是一条直线粗线)并且它的工作方式就像 MS-Word :

a) 当您将带有下划线的文本移动到别处时它不会被复制粘贴,当您保存文档时它也不会被保存

b) 它没有被添加到撤消堆栈中。

所以从 a) 和 b) 我得出结论,这不是文本格式

所以一定有办法,我想知道我怎样才能做到这一点。

提前感谢您的任何想法或提示。

我相信 Grammarly 强调它想要标记的单词和短语的方式是以一种非常聪明和可控的方式临时更改文档。 Grammarly 仅在单击 Grammarly 功能区上的 Open Grammarly 按钮时才起作用。如果你做一个简单的实验,你或许可以观察到 Grammarly 如何控制它的临时变化。

首先创建一个未保存的文档,其中包含一些拼写错误的单词,这些单词会触发 Microsoft Word 显示红色波浪线。然后单击 Open Grammarly 按钮。请注意,加载项关闭了拼写检查并用它自己的网络触发标记替换了 Word 的红色波浪线。这些可能是在文档中使用类似于以下代码生成的:

myRange.Font.Underline = Microsoft.Office.Interop.Word.WdUnderline.wdUnderlineThick;
myRange.Font.UnderlineColor = Microsoft.Office.Interop.Word.WdColor.wdColorRed;

观察到这一点后,保存文档。如果你仔细看你的屏幕(如果你的电脑不是超快),你会看到一个小的闪烁,其中红色粗下划线会短暂消失。那是 Document.BeforeSave 事件在保存文档之前删除语法标记。通过依赖于用户操作(例如当用户单击 Grammarly 功能区按钮时),Grammarly 控制标记出现的时间点。然后它使用代码和事件来确保标记不会与文档一起保存或干扰其他操作。要为您自己的拼写检查器加载项复制此行为,您希望查看的主要事件是:

Document.BeforeSave Event

Document.BeforePrint Event

Document.BeforeClose Event

遗憾的是,MS Word 不提供开箱即用的功能来让您实现这一点。 Grammarly 和其他具有类似功能的附加组件的工作方式是使用 Windows API 在 MS Word window 之上显示透明 window。然后他们确定需要突出显示的单词的坐标,并在这些单词顶部的透明 window 内部绘制突出显示(矩形或下划线)。这不是一个简单的解决方案,因为它需要识别当前显示在屏幕上的可见范围,找到该范围内需要突出显示的单词,并跟踪用户的操作,例如滚动和 window 调整大小,因此在这些操作之后重新绘制突出显示。但可以肯定的是,这是可能的,因为我们最近在我正在开发的产品中做到了这一点。据我所知,目前还没有现成的开源解决方案,因此您需要自己实现所有内容。

您还可以考虑一个更简单的解决方案,即使用 Find.HitHighlight 功能突出显示单词。当您在 MS Word 中搜索一个简单的词时,您可以看到它如何工作的示例。虽然这不是一个非常灵活的解决方案,因为您唯一可以更改的是突出显示的颜色。