2010-03-04 5 views
3

J'utilise la vérification orthographique de Word dans mon application de WinForm de maison. Mes clients sont tous des machines XP avec Office 2007 et, au hasard, la boîte à suggestions de vérification orthographique apparaît derrière l'application et rend tout "figé" comme vous ne pouvez pas y accéder.

Suggestions? Que font les autres pour contourner ce problème ou l'arrêter complètement?

Merci

Ci-dessous mon code, pour référence.

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; 
    } 
} 

Et je l'appelle de mon application WinForm comme si ->

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(); 
       } 
      } 
     } 
    } 

Répondre

4

Je sais que c'est à partir de 2010, mais il a pris toute la journée pour comprendre que le pop-up de correcteur orthographique dépend de deux classes (avant d'écrire toute votre logique).

Voici les définitions de votre application Word et de votre document Word.

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

doit être:

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

et doit être

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

le document (ce qui est correct dans la question initiale) Si vous utilisez le aucunes classes soulignées vous ne recevrez aucune erreur, mais soit le spellchecke r sera "piégé" à l'intérieur de l'application mot caché, verrouillant votre application pendant qu'il attend l'entrée de l'utilisateur, ou il apparaîtra derrière votre application, un résultat qui est tout aussi mauvais si vous travaillez avec une application verrouillée en plein écran - comme nous sommes avec notre logiciel interne.

J'espère que cela a aidé!

+0

Merci @AJ McK. J'ai également eu problème similaire à celui abordé dans la question ci-dessus et il résolu avec votre réponse. – Madhuri

+0

Avant de tester en mode débogage, cela fonctionnait. Mais maintenant, j'essaie de lancer exe encore Word Spell Check apparait caché et "gèle" mon application. Pouvez-vous s'il vous plaît m'aider à ce sujet. – Madhuri

1

Il pourrait être le gel de votre application, car le document Word est en cours d'exécution sur le thread d'interface utilisateur, essayez d'exécuter votre document un nouveau thread et utilisez les événements pour le récupérer dans le thread de l'interface utilisateur

+0

Il « gèle » parce qu'il est en attente d'entrée d'utilisateur dans les suggestions de correction orthographique de dialogue, mais puisqu'il est caché derrière l'application, vous ne pouvez pas y accéder. Peut-être que c'est ce que vous dites ... peut-être. –

+1

@ Refrain Paladin: Ensuite, il suffit de mimimaliser votre application ou d'utiliser une fonction user32.dll pour amener votre fenêtre de vérification orthographique à l'avant – caesay

+0

Impossible de minimiser l'application car elle est "verrouillée". Je vais Google votre suggestion 'user32.dll'. –

1

Avez-vous essayé d'appeler checkspelling avec null au lieu de manquer?

Voici mon code. J'avais l'habitude d'avoir le même problème que vous aviez mais j'appelais Checkspelling sans aucun argument. J'utilise le type manquant juste pour ajouter le doucment ... notez également le WordDoc.Activate(); Avant de vérifier l'orthographe, je pense que cela aide également à la pousser vers l'avant.

 
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); 

+0

Je vais essayer et faire un rapport. Merci –

2

J'ai essayé d'activer la fenêtre mais il aborderait l'application entière de la parole et tout ce que je voulais était la boîte de dialogue de vérification orthographique à apparaître. Je mets le WordApp.WindowState droit avant d'appeler CheckSpelling et qui a fonctionné pour moi:

WordApp.WindowState = WdWindowState.wdWindowStateNormal; 
+0

_WdWindowState.wdWindowStateNormal_ travaille pour VS 2012. Mais cela ne fonctionne pas dans VS2010 – Madhuri

0

En plus de CheckSpelling() méthode que j'ai ajouté après un bloc de code qui m'a aidé pour l'application VS2010 winform

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

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