我正在尝试将单词拼写检查集成到WinForms应用程序中。到目前为止,互操作性一直是后方的严重痛苦。经过几个小时的乱搞,我终于得到了实际的拼写检查。 CheckSpellingOnce以及底层的CheckSpelling方法按预期执行,但只要我调用GetSpellingSuggestions,应用程序就会抛出...
抛出异常:ClosedCaption.Spelling.dll中的“System.Runtime.InteropServices.COMException”附加信息:此命令不是 可用,因为没有文档打开。
第一个想法是底层COM对象与其相应的包装器断开连接,因为_wordApp是从与创建的不同的线程调用的。所以我尝试在CheckSpelling()中调用它,遗憾的是结果相同。我还尝试打开和关闭文档,向现有应用程序实例添加新文档,以及从_document对象本身获取应用程序(_document.Application.GetSpellingSuggestions)。
那是什么?
附加信息:当定时器事件被触发时(一旦用户停止在RichTextField中键入),从UI调用CheckSpellingOnce方法 - 所以多次 - 使用相同的_wordApp对象,因为我试图避免启动多个实例winword.exe。
/// <summary>
/// Checks spelling with the text from the provided richtextbox in a new thread.
/// </summary>
public void CheckSpellingOnce()
{
_checkerThread = new Thread(new ThreadStart(CheckSpelling));
_checkerThread.Start();
}
/// <summary>
/// Checks the spelling of a richtextbox. Raises an event with the result when done.
/// </summary>
private void CheckSpelling()
{
if (_shouldBeChecking)
{
RaiseStatusChanged(SpellCheckStatus.Working);
Word.ProofreadingErrors toReturn = null;
UpdateStringFromTextBox();
if (!string.IsNullOrEmpty(_fromTextBox))
{
_document.Content.Delete();
_document.Words.First.InsertBefore(_fromTextBox);
_document.Content.LanguageID = _language; //Must be set specifically here for some f***d reason.
toReturn = _document.SpellingErrors;
RaiseSpellingChecked(toReturn);
RaiseStatusChanged(SpellCheckStatus.Idle);
}
}
}
public Word.SpellingSuggestions GetSpellingSuggestions(string word)
{
//throw new NotImplementedException();
Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing);
return toReturn;
}
即使有了GetSpellingSuggestions的这种实现,它也会在“toReturn”行中抱怨,而不是在它上面的那些...
public void GetSpellingSuggestions(string word)
{
//throw new NotImplementedException();
var _suggestionThread = new Thread(new ThreadStart(() =>
{
_document.Content.Delete();
_document.Words.First.InsertBefore(word);
_document.Content.LanguageID = _language;
Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing);
Debug.Print(toReturn[0].ToString());
}));
_suggestionThread.Start();
}
答案 0 :(得分:1)
/// <summary>
/// Opens a Word interop lib document.
/// </summary>
/// <returns></returns>
private Word._Document OpenDocument()
{
object visible = false;
_document = _wordApp.Documents.Add(_missing, _missing, _missing, visible);
return _document;
}
这就是我打开文档的方式(内存中)。
将可见参数设置为&#39; true&#39;解决了问题 - 但由于某些原因(在我的情况下是预期的)保持应用程序进程在后台运行。 我的理论是winword.exe在调用Document.CheckSpelling()之类的方法之前保持不可见 - 这实际上调用了Word GUI。
如果有人需要,可以提供更多代码。
感谢您的建议,干杯!