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

问题描述

在制作 MS Word 插件拼写检查器时,我面临着“下划线”的问题。我可以使用 Word 对象模型的格式化功能来为拼错的单词着色或按照用户使用 U 按钮的方式给它们加下划线,但这与不显示的原生 ms-word 卷曲下划线不同如果您将文本复制粘贴到其他地方,则不会打印或保存,也不会在撤消操作中显示。我一直在寻找怎么做,但每个人都说这是不可能的。

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

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

b) 它不会被添加到撤消堆栈中。

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

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

预先感谢您提供任何想法或提示

解决方法

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

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

,

我相信 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...