3

社内の 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();
                }
            }
        }
    }
4

5 に答える 5

4

これが 2010 年のものであることは知っていますが、スペル チェッカーのポップアップが 2 つのクラスに依存していることを理解するのに 1 日かかりました (すべてのロジックを記述する前に)。

これは、Word アプリケーションと Word ドキュメントの定義です。

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

する必要があります:

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

ドキュメント(元の質問では正しい)は、

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

アンダースコアなしのクラスを使用すると、エラーは発生しませんが、スペルチェッカーが隠し単語アプリ内に「トラップ」されて、ユーザーの入力を待機している間にアプリがロックされるか、アプリの背後にポップアップして、その結果全画面ロックされたアプリケーションで作業している場合は、社内ソフトウェアと同じように悪い.

これが役に立ったことを願っています!

于 2013-04-10T13:58:44.973 に答える
2

ウィンドウをアクティブにしてみましたが、単語アプリケーション全体が表示され、スペルチェックダイアログが表示されるだけでした。CheckSpellingを呼び出す直前にWordApp.WindowStateを設定しましたが、これでうまくいきました。

WordApp.WindowState = WdWindowState.wdWindowStateNormal; 
于 2010-08-18T21:39:45.293 に答える
1

ドキュメントという単語がUIスレッドで実行されているため、アプリケーションがフリーズする可能性があります。ドキュメントを新しいスレッドで実行し、イベントを使用してUIスレッドに戻してみてください。

于 2010-03-04T20:38:01.037 に答える
1

行方不明ではなくnullでチェックスペルを呼び出してみましたか?

これが私のコードです。私はあなたが抱えていたのと同じ問題を抱えていましたが、引数なしで Checkspelling を呼び出していました。ドキュメントを追加するためだけに欠落しているタイプを使用します.WordDoc.Activate();にも注意してください。スペルをチェックする前に、これも前面に押し出すのに役立つと思います。

プライベート オブジェクト emptyItem = System.Reflection.Missing.Value;
プライベート オブジェクト oNothing = null;
プライベート オブジェクト oFalse = false;
    ...

    wordApp = 新しい 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);

于 2010-03-24T00:11:21.477 に答える