OLE Automation pour le lancement de MS Word et l'amener à l'avant
Ce qui est "correct" (recommandé) méthode pour se connecter à une instance en cours d'exécution de MS Word et de porter cette application sur le front? Je suis en train de faire quelque chose comme ce qui suit à partir d'une application VBA:
...
objWord = GetObject ("Word.Application")
if (objWord is nothing) then
objWord = CreateObject("Word.Application")
end if
objWord.Activate()
objWord.Visible = true
objWord.WindowState = 1 'maximized
...
Exécuté sur Windows XP avec Word 2007, cela fonctionne la plupart du temps - mais périodiquement, ne parvient pas à mettre le Mot fenêtre à l'avant (et, au lieu de bouffées de chaleur réduit l'icône de Word dans la barre des tâches).
NOTE: j'ai partiellement résolu ce problème en utilisant la fonction FindWindow Gagner l'appel d'API:
hwnd = FindWindow("OpusApp", vbNullString)
If hwnd > 0 Then
SetForegroundWindow (hwnd)
end if
Ce n'est pas 100% parce que (comme drventure souligné), si plusieurs instances de Word sont en cours d'exécution, vous ne pouvez pas être certain qui vous permettra d'obtenir une poignée de. Depuis quand mon code lance Word il utilise la fonction GetObject d'abord et ensuite CreateObject si cela échoue, tant qu'il y est une instance de Word en cours d'exécution pour commencer, je suis OK.
Quand je vérifie windowstate,c'est toujours 1 (agrandie). Aussi, lorsque je minimise l'application appelante, Word est ouvert agrandie. Donc, je pense que le problème n'est pas l'état de la fenêtre, mais plutôt de l'ordre de superposition. Mais j'ai bien Activer() Mot à l'avant?
OriginalL'auteur Ed Schembor | 2010-10-05
Vous devez vous connecter pour publier un commentaire.
Word (ou Excel) n'inscrivent que la PREMIÈRE INSTANCE qui se charge dans la table ROT (Running object table).
La POURRITURE est où GETOBJECT "devient l'objet", de sorte que, dans certaines circonstances, son' possible d'avoir deux instances de WinWord.exe chargé, l'un visible, on pas, mais l'instance invisible est celui qui est inscrit dans la POURRITURE et le visible ne l'est PAS.
Vous aurez le comportement que vous vous voyez.
Malheureusement, sans appels d'API pour énumérer toutes les fenêtres ouvertes sur le système, vous courez toujours le risque que GETOBJECT ne vous ferez pas l'objet que vous attendez.
Il n'y a pas beaucoup de moyen de contourner cela.
Par ailleurs, vous êtes l'objectif final est un peu suspect quand même.
Quand vous dites "qu'est-Ce que la "bonne" méthode pour se connecter à une instance en cours d'exécution de MS Word et de porter cette application sur le front?", qu'advient-il si il y a 2 ou plusieurs cas réels de Winword.exe chargé?
Qui voudriez-vous "se connecter" et l'amener à l'avant. c'est un coup de dés de toute façon, sauf si vous êtes particulièrement intéressé dans un DOCUMENT particulier, par la fenêtre ouverte.
De ce que je comprends, Word enregistre TOUTES les fenêtres de document dans la POURRITURE, indépendamment de l'instance de Winword il est, de sorte que vous pourrait théoriquement Utiliser la fonction Getobject pour récupérer un DOCUMENT particulier, d'obtenir l'APPLICATION de l'objet de l'objet DOCUMENT puis de le rendre VISIBLE avec une NORMALE windowstate.
Voici un exemple de GetObject pour un document
http://support.microsoft.com/kb/307216
Une chose d'être conscient de. J'ai remarqué des "irrégularités" avec la prise d'une instance de word créés par l'intermédiaire de "CreateObject" visible et d'essayer de l'utiliser comme un utilisateur normal.
Windows va parfois pas de peinture à droite, les barres de défilement s'arrête de fonctionner, le ruban de travail parfois, d'autres non. Je ne sais pas pourquoi, mais je soupçonne quand créés par l'intermédiaire de la fonction CreateObject, la parole de l'instance de ne pas aller à travers l'ensemble de l'installation de ses éléments visuels. Les bombardements de mot pour commencer elle a réduit au minimum, puis attacher à cette instance via la fonction GETOBJECT jamais a ces questions.
OriginalL'auteur DarinH