Word拼写检查弹出隐藏并“冻结”我的应用程序

时间:2010-03-04 20:22:02

标签: c# .net winforms spell-checking office-interop

我在我的内部WinForm应用程序中使用Word的拼写检查。我的客户都是带有Office 2007的XP机器,随机会在应用程序后面弹出拼写检查建议框,并使所有内容“显示”冻结,因为您无法获取它。

连连呢?其他人如何解决这个问题或完全停止呢?

由于

以下是我的代码,供参考。

public class SpellCheckers
{
    public string CheckSpelling(string text)
    {
        Word.Application app = new Word.Application();
        object nullobj = Missing.Value;
        object template = Missing.Value;
        object newTemplate = Missing.Value;
        object documentType = Missing.Value;
        object visible = false;
        object optional = Missing.Value;
        object savechanges = false;
        app.ShowMe();

        Word._Document doc = app.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);

        doc.Words.First.InsertBefore(text);
        Word.ProofreadingErrors errors = doc.SpellingErrors;

        var ecount = errors.Count;
        doc.CheckSpelling(ref optional, ref optional, ref optional, ref optional, 
            ref optional, ref optional, ref optional, ref optional, ref optional, 
            ref optional, ref optional, ref optional);
        object first = 0;
        object last = doc.Characters.Count - 1;
        var results = doc.Range(ref first, ref last).Text;
        doc.Close(ref savechanges, ref nullobj, ref nullobj);
        app.Quit(ref savechanges, ref nullobj, ref nullobj);

        Marshal.ReleaseComObject(doc);
        Marshal.ReleaseComObject(app);
        Marshal.ReleaseComObject(errors);

        return results;
    }
}

我从我的WinForm应用程序中调用它 - >

  public static void SpellCheckControl(Control control)
    {
        if (IsWord2007Available())
        {
            if (control.HasChildren)
            {
                foreach (Control ctrl in control.Controls)
                {
                    SpellCheckControl(ctrl);
                }
            }

            if (IsValidSpellCheckControl(control))
            {
                if (control.Text != String.Empty)
                {
                    control.BackColor = Color.FromArgb(180, 215, 195);
                    control.Text = Spelling.CheckSpelling(control.Text);
                    control.Text = control.Text.Replace("\r", "\r\n");
                    control.ResetBackColor();
                }
            }
        }
    }

5 个答案:

答案 0 :(得分:4)

我知道这是从2010年开始的,但是花了一整天才弄清楚拼写检查器弹出窗口依赖于两个类(在你编写所有逻辑之前)。

这是Word应用程序和Word文档的定义。

Word.Application app = new Word.Application();

需要:

Word._Application app = new Word.Application();

并且文档(在原始问题中是正确的)需要

Word._Document doc = app.Documents.Add([Missing.Value passes]);

如果您使用无下划线的课程,您将不会收到任何错误,但拼写检查器将被“困在”隐藏的单词应用程序中,在等待用户输入时锁定您的应用程序,或者它会弹出您的应用程序,如果您正在使用全屏锁定应用程序,那么结果同样糟糕 - 就像我们使用内部软件一样。

希望这有帮助!

答案 1 :(得分:2)

我尝试激活窗口,但它会显示整个单词应用程序,我想要的就是拼写检查对话框出现。我在调用CheckSpelling之前设置了WordApp.WindowState,这对我有用:

WordApp.WindowState = WdWindowState.wdWindowStateNormal; 

答案 2 :(得分:1)

它可能会冻结您的应用程序,因为word文档正在UI线程上运行,尝试在新线程中运行您的文档并使用事件将其恢复到UI线程

答案 3 :(得分:1)

您是否尝试使用null调用checkpelling而不是丢失?

这是我的代码。我曾经遇到过同样的问题,但我没有任何争论地调用Checkspelling。我使用缺少类型只是为了添加doucment ..还要注意WordDoc.Activate();在检查拼写之前,我认为这也有助于将其推到前面。

private object emptyItem = System.Reflection.Missing.Value;
private object oNothing = null;
private object oFalse = false;
    ...

    wordApp = New Word.Application();
    wordApp.Visible = False;


    WordDoc = WordApp.Documents.Add(ref emptyItem,ref emptyItem,ref emptyItem,ref oFalse);

                WordDoc.Words.First.InsertBefore(this.Text);

                Microsoft.Office.Interop.Word.ProofreadingErrors docErrors = WordDoc.SpellingErrors;
                SpellingErrors = docErrors.Count;
                WordDoc.Activate();
                WordApp.ShowWindowsInTaskbar = False;
                WordDoc.CheckSpelling(ref oNothing, ref oIgnoreUpperCase, ref oAlwaysSuggest,ref oNothing, ref oNothing, ref oNothing, ref oNothing, ref oNothing,ref oNothing, ref oNothing, ref oNothing, ref oNothing);

答案 4 :(得分:0)

在CheckSpelling()方法的基础上,我添加了以下代码块,帮助我完成VS2010 winform应用程序

    [DllImport("user32.dll")]  
    private static extern IntPtr GetForegroundWindow();

    public string CheckSpelling(string text)
    {
     ---------
     ****Your code for Spell Check ****
     ---------
    }