Word Spell Check выскакивает скрытое и "зависает" мое приложение - PullRequest
3 голосов
/ 04 марта 2010

Я использую Word Spell Check в моем собственном приложении WinForm. Все мои клиенты - это все компьютеры под управлением XP с Office 2007, и случайным образом окно с предложением проверки орфографии появляется за приложением и заставляет все «казаться» замороженным, так как вы не можете получить его.

Предложения? Что делают другие люди, чтобы обойти это или вообще остановить?

Спасибо

Ниже приведен мой код для справки.

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 ]

4 голосов
/ 10 апреля 2013

Я знаю, что это с 2010 года, но весь день уходит на то, чтобы выяснить, что всплывающее окно проверки орфографии зависит от двух классов (прежде чем вы напишете всю свою логику).

Это определенияваше приложение Word и ваш документ Word.

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

должно быть:

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

, а документ (который является правильным в исходном вопросе) должен быть

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

Если вы используете не подчеркнутые классы, вы не получите никаких ошибок, но либо проверка орфографии будет «захвачена» внутри приложения скрытого слова, блокируя ваше приложение, пока оно ожидает пользователявход, или он появится за вашим приложением, результат, который столь же плох, если вы работаете с полноэкранным заблокированным приложением - как и с нашим собственным программным обеспечением.

Надеюсь, это помогло!

2 голосов
/ 19 августа 2010

Я попытался активировать окно, но оно вывело бы все текстовое приложение, и все, что я хотел, это появиться диалоговое окно проверки орфографии. Я установил WordApp.WindowState прямо перед вызовом CheckSpelling, и это сработало для меня:

WordApp.WindowState = WdWindowState.wdWindowStateNormal; 
1 голос
/ 24 марта 2010

Вы пробовали вызывать чек-орфографию с нулем вместо пропуска?

Вот мой код.Раньше у меня была та же проблема, что и у вас, но я звонил в Checkspelling без каких-либо аргументов.Я использую отсутствующий тип только для добавления документа. Также обратите внимание на 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);

1 голос
/ 04 марта 2010

Это может заморозить ваше приложение, потому что документ word выполняется в потоке пользовательского интерфейса, попробуйте запустить ваш документ в новом потоке и использовать события, чтобы вернуть его в поток пользовательского интерфейса

0 голосов
/ 08 декабря 2017

Помимо метода CheckSpelling () я добавил следующий блок кода, который помог мне для приложения winform VS2010

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

    public string CheckSpelling(string text)
    {
     ---------
     ****Your code for Spell Check ****
     ---------
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...