2011-06-03 1 views
2

J'ai un code JScript (converti de certains vieux VBScript) qui commence comme ceci:Apportez la fenêtre de vérification orthographique au premier plan avec JavaScript/JScript dans Windows 7

var Word = new ActiveXObject("Word.Basic"); 

Word.FileNew(); // opens new Word document 
Word.Insert(IncorrectText); 
Word.ToolsSpelling(); // opens spell check behind IE 

L'idée est d'utiliser le sort MS Word contrôle Windows XP/XP 8 (this question m'indique que le problème a commencé sous Vista et est probablement un problème de système d'exploitation, pas un problème de navigateur ou d'Office) . Donc, ma question est, comment puis-je mettre cette fenêtre à l'avant-plan? Une remarque importante est que la dernière ligne, Word.ToolsSpelling();, verrouille mon script, donc tout ce que je fais devra être avant cela.

J'ai essayé

var wshShell = new ActiveXObject("WScript.Shell"); 
wshShell.AppActivate("Document1 - Microsoft Word"); // or some other text 

avant l'appel ToolsSpelling, mais cela ne fait rien (peut-être parce que le document Word n'est pas réellement révélé à ce point?). Bien sûr, cela ne fonctionnera que si "Document1" n'est pas déjà ouvert, donc c'est une réflexion discutable pour commencer.

Par this answer, j'ai essayé d'utiliser window.blur(); afin de flouter IE, mais cela ne fonctionnera que si la fenêtre IE est la seule ouverte. Peut-être y at-il un moyen de boucler toutes les fenêtres ouvertes et de les appliquer?

SetForegroundWindow semblait prometteur, mais je ne sais pas comment l'utiliser dans JSript.

Des idées?

Remarque: Les autorisations du navigateur seront complètement ouvertes pour ce site.

Mise à jour: Il s'avère que si vous utilisez Word.Application, la vérification orthographique est placée devant comme il se doit. Seule la méthode Word.Basic a ce problème (je ne pense pas savoir pourquoi ce côté de l'éternité):

var wordApp = new ActiveXObject("Word.Application"); 
wordApp.Documents.Add(); 
wordDoc = wordApp.ActiveDocument; 
... // safety checks before insertion 
wordSelection.TypeText(IncorrectText); 
wordDoc.CheckSpelling(); 
wordApp.Visible = false; // CheckSpelling makes the document visible 

Répondre

2

Vous pourriez être en mesure de JIGGER l'état de la fenêtre. Lorsque la fenêtre est agrandie après avoir été minimisée, Windows l'empilera à l'avant (zIndex en haut).

Quelque chose comme:

var WIN_MAX = 2; 
var WIN_MIN = 1; 

var Word = new ActiveXObject("Word.Application"); 
Word.Visible = true; 
// minimize the app 
Word.WindowState = WIN_MIN ; 
// in 500ms, maximize 
setTimeout(function() { 
    Word.WindowState = WIN_MAX; 
}, 500); 

L'appel setTimeout cherche à contourner un problème de synchronisation; Windows sera parfois "confus" quand une minimisation/maximisation programmatique se produit dans une succession immédiate. Vous devrez peut-être prolonger un peu ce délai, le tester à plusieurs reprises et voir quel genre de résultats vous obtenez.

+0

Je reçois une erreur «Objet ne prend pas en charge cette propriété ou méthode» avec 'Word.Visible = true;'. Pareil avec 'Word.WindowState = WIN_MIN'. Peut-être que ces fonctions ne sont pas valides avec Word.Basic? – jtpereyda

+0

Pouvez-vous essayer Word.Application comme ActiveXObject à la place? Faites le moi savoir. –

+0

'var Word = new ActiveXObject (" Word.Application ");' fonctionne, mais invalide les autres appels. Je pense que le remplacement de 'Word.FileNew()' est 'Word.Documents.Add()', mais j'ai des problèmes avec la sélection. Si vous ou quelqu'un connaissiez déjà cette API, cela serait utile. Sinon, je vais le ramasser après le week-end. – jtpereyda

Questions connexes