Récupération Handle d'une fenêtre Word

Flohe Messages postés 4 Date d'inscription mardi 27 janvier 2009 Statut Membre Dernière intervention 23 mars 2009 - 23 mars 2009 à 11:55
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 23 mars 2009 à 13:25
Bonjour,

Je souhaite à partir d'une application Access lancer une instance de Word d'une version bien précise, alors que sur le poste, plusieurs versions de word sont déjà installées (97 à 2007...).

A partir du chemin de l'exécutable de la verison 97 par exemple, et une instruction Shell, j'arrive à lancer Word, je suis capable, via l'API FindWindow de récupérer son Handle, mais je n'arrive pas à associer à une variable Word.Application ce Handle.

Exemple :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Function OuvertureWord() As Word.Application
Dim ObjWd As Word.Application
Dim StrExe As String
Dim numFenetre as Variant

   StrExe="C:\Program Files\...\WinWord.exe"
   Shell StrExe, vbMaximizedFocus

   Do While Isempty(NumFenetre) Or NumFenetre=0
      NumFenetre=FindWindow(vbNullString, "Document1 - Microsoft Word")
      Doevents
   Loop

End Function
   
J'arrive donc à récupérer un numéro dans NumFenetre, mais je ne sais pas comment le réutiliser pour l'associer à ma variable ObjWd.
Je tiens à préciser que je ne peux pas utiliser les instruction New Word.Application, ni CreateObject qui ne me permettent pas de choisir la version...
Si vous savez (en plus) comment récupérer le Handle SANS le titre qui peut dépendre de la langue, mais plutôt de l'EXE...

Si vous avez une idée ou une piste... Elle sera la bienvenue !

D'avance, merci.
Florent

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 12:00
tu peux surement lancer un GetObject...
0
Flohe Messages postés 4 Date d'inscription mardi 27 janvier 2009 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 12:15
Merci pour ta proposition rapide.
J'ai testé cette fonction, mais même dans une boucle pour attendre que le processus soit réellement temriné, le GetObject me renvoie toujours Nothing...

Do While IsEmpty(NumFenetre) Or NumFenetre = 0
NumFenetre = FindWindow(vbNullString, "Document1 - Microsoft Word")
Set ObjWd = GetObject(StrExeWord)
Err.Clear
Loop

Je ne comprends pas pourquoi, d'où une tentavie par le Handle...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 12:24
virgule mal placée...

Set OuvertureWord = GetObject(, "Word.Application")
0
Flohe Messages postés 4 Date d'inscription mardi 27 janvier 2009 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 12:24
Réponse précédente avec les retours à la ligne...
Merci pour ta proposition rapide. J'ai testé cette fonction, mais même dans une boucle pour attendre que le processus soit réellement temriné, le GetObject me renvoie toujours Nothing...

Do While IsEmpty(NumFenetre) Or NumFenetre = 0
   NumFenetre = FindWindow(vbNullString, "Document1 - Microsoft Word")
   Set ObjWd = GetObject(StrExeWord)
   Err.Clear
Loop

Je ne comprends pas pourquoi, d'où une tentavie par le Handle...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Flohe Messages postés 4 Date d'inscription mardi 27 janvier 2009 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 12:37
En fait, je tentais une récupération par l'EXE... (au cas où une autre instance d'une autre version de Word est déjà ouverte...)
Je fais des tests avec la récupération par la classe et reviens donner les résultats ! 

Merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 13:25
tu peux parcourir la ROT (RunningObjectTable) a ta guise...
et récupérer précesément ton instance... reste a l'identifier.

maintenant, tout dépend de ce que tu souhaites faire, au final.

si tu fais un GetObject, tu pourras recuperer une instance existente.
si tu as pas trouvé d'instance, fais un CreateObject. Place alors un flag qui t'indiquera qu'il te faut détruire l'instance de Word
0
Rejoignez-nous