Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/12/2011, 10h42   #1
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Par défaut Accès à IE 8 sans processus iexplorer.exe

Bonjour,
Je voudrais accéder à une fenêtre IE8 qui est ouverte par un autre programme.
Le soucis, c'est que le processus ne s'appelle pas iexplorer.exe, mais porte le nom du programme qui l'ouvre.

Sur les machines, IE6 est installé, et IE8 est ouvert à partir d'un serveur distant. Je ne pourrais pas vous expliquer comment, mais IE8 est chargé sur les ordinateurs clients au lancement d'une application.

J'ai besoin d'accéder à IE8 pour remplir automatiquement des formulaires qui sont présents sur la page.

Avez vous une idée ?

Je dois passer par le Handle de la fenêtre? Par le nom du precessus?

Merci de votre aide.
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 10h51   #2
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

As tu essayer d'utiliser GetObject, pour voir si la fenêtre IE8 est "capturée?

Code :
1
2
3
4
 
Dim IE as Object 'ou InternetExplorer si tu actives les références IE
'Initialisation des variables
Set IE = GetObject("InternetExplorer.Application")
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 11h08   #3
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Salut, j'ai une erreur d'automation avec ton code...

Mais je ne pense pas pouvoir recuperer IE8 de cette manière car le processus ne pote pas le nom iexplorer.exe...

J'avais essayé ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
Dim appIE As Object 'InternetExplorer
Dim HTMLDoc As Object 'HTMLDocument
 
    Set appIE = CreateObject("InternetExplorer.Application")
    Set winShell = CreateObject("Shell.Application").Windows
 
    'Recherche la bonne page
    For Each appIE In winShell
        MsgBox appIE.LocationURL
    Next appIE
Mais ça ne marche pas.
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 11h14   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Dans ce cas essai d'utiliser FindWindow pour trouver le handle de ta fenêtre, dans un premier temps ça t'indiquera déjà s'il est possible d'interagir avec elle, il faudrait que je teste au boulot, on a aussi un IE distant via un server Citrix...(et oui on a pas tous les jour de la chance...)

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 11h57   #5
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Je suis dans le même cas que toi

J'arrive à toucher le handle de la fenetre avec le nom de cette dernière donc je dois pouvoir bricoler quelque chose...

J'ai installé WinID, j'arrive à activer la fenêtre au premier plan, grâce à son Handle, mais je n'arrive pas à accéder aux liens qui sont dans la page web...

Il n'ont pas de handle.
Peut être qu'il y a une methode pour parcourir tous le contenu de la page...

Je veux dans un premier temps simuler un clique sur un lien.
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 12h48   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Le premier soucis est de dire que tel handle correspond à une instance d'IE et pour le moment je vois pas comment faire :p

Une piste serait peut être GetWindowLong, qui donne le handle de l'instance parent, qui je pense doit être l'instance d'IE, mais ici on a que l'handle il faut encore le passer à un variable object... à suivre.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 15h16   #7
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
C'est exactement le soucis que j'ai...
Soit j'arrive à faire avaler à VBA que le handle de ma fenetre est belle et bien du IE...
Soit j'utilise les handles et Sendmessage pour naviguer avec le clavier...

Bloqué je suis...
Les API du genre : SendKey, Postmessage et autres ne font rien sur la fenetre...

Pourtant si j'appuie sur tabulation au clavier, je peux me déplacer sur les différents liens...

Pour info, avec WinID, lorsque je pointe ma souri sur la fenetre en question, la class est du type :"Transparent Windows Client " Donc si je pointe un lien ou un bouton de IE8, le Handle ne change pas...

Comment faire? That is the question !
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 17h58   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Essai peut-être avec l'API EnumWindows, elle te permettra peut-être d'obtenir la liste des fenêtres fille de la fenêtre "Transparent Windows Client".
Mais encore une fois avec un appli server je ne suis pas sur qu'il soit possible de manipuler les fenêtre avec les handle, l'application que l'on a sous les yeux est une "image" de l'application qui tourne sur le server distant. Ainsi je ne suis pas sûr que les fenêtres aient des handles en local...

Si j'ai le temps je ferais des teste au boulot. C'est marrant, j'ai la même configuration au taff, l'IE server est plus récent que l'IE local et certaines appli ne peuvent pas tourner en local sur IE.... parce qu'ils (service info, enfin c'est une décision de l'entreprise) refusent de nous installer Java machine....
Un nom d'appli des fois qu'on soit dans la même boite est Aïda (rien à voir avec un groupe terroriste ^^').

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 21h51   #9
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Aîda ne me dit rien !

Et moi si je te dis : "AeroWeb"?
Ou bien "Planet"?

@+
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 22h27   #10
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Rien du tout ^^, j'essais de regarder dès que possible.
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 07h27   #11
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Salut,
J'ai du mal avec EnumWindows...

Je ne vois pas trop comment lister toutes les fenêtres filles...
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 20h53   #12
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

EnumChildWindows serait plus adapté en effet, il te permet de lister les handle enfants d'une fenêtre.

Voila un exemple d'utilisation mais les handles trouvés ne retourne pas de nom de class, je ne comprend pas bien ce qu'il pointe.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
 
Sub test()
Dim hwndIE As Long, HwndEIAppli As Long, lgRetour As Long
 
hwndIE = FindWindow(vbNullString, "Google - Windows Internet Explorer")
 
HwndEIAppli = GetWindowLong(hwndIE, -6)
 
 
' *** Place this code wherever you want to enumerate the windows. ***
Dim retval As Long ' return value
 
' Use the above callback function to list all of the enumerated windows. Note that lParam is
' set to 0 because we don't need to pass any additional information to the function.
retval = EnumChildWindows(hwndIE, AddressOf EnumChildProc, 0)
 
End Sub
 
 
Sub EssaiEnum()
 
End Sub
 
'Source du code http://www.ex-designz.net/apidetail.asp?api_id=317
' Display the title bar text of all children of window MDIForm1. This
' task is given to the callback function, which will receive each handle individually.
 
' *** Place this code in a module. This is the callback function. ***
' This function displays the title bar text of the window identified by hwnd.
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim slength As Long, wintext As String ' title bar text length and buffer
Dim retval As Long ' return value
Dim Buffer As Variant
Static winnum As Integer ' counter keeps track of how many windows have been enumerated
 
winnum = winnum + 1 ' one more window enumerated....
slength = GetWindowTextLength(hwnd) + 1 ' get length of title bar text
Buffer = Space(slength) ' make room in the buffer
retval = GetWindowText(hwnd, Buffer, slength) ' get title bar text
Debug.Print "Window #"; winnum; " : "; ' display number of enumerated window
Debug.Print Left(Buffer, slength - 1) ' display title bar text of enumerated window
 
Buffer = Space(20)
GetClassName hwnd, Buffer, 20
Debug.Print Buffer
 
EnumChildProc = 1 ' return value of 1 means continue enumeration
End Function
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h52   #13
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
Tu penses qu'il y aurait moyen de bricoler un truc???

Bon et bien ca ne me list rien du tout!!!
Ca marche pour les vrais programme mais pour IE8 lancé sur serveur, c'est fichu!

Mais pourquoi la simulation d'appui sur une touche clavier ne marche pas???
Je voulais me deplacer avec TAB pour selectionner mon lien, mais rien a faire ca ne marche pas, alors que physiquement je peux le faire...

Saloperie de class transparente fantome de m****

No solution...

J'arrive à bidouiller un truque en adaptant un code VB

Il faut en faite passer par le processus wfica32.exe qui correspond à citrix...
Voici le lien d'origine :
http://waynes-world-it.blogspot.com/...live-with.html
Le code pour VBA
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub test()
Dim objWshSheel As Object
Set objWshShell = CreateObject("Wscript.Shell")
strProcessName = "wfica32.exe"
intProcessID = 0
Call FindProcessID(strProcessName, intProcessID)
 
If (intProcessID > 0) Then
  objWshShell.AppActivate (intProcessID)
  Pause 0.2
  objWshShell.SendKeys "~"
  Pause 0.2
End If
 
End Sub
 
Function FindProcessID(ByRef strProcessName, ByRef intProcessID)
 
 strQuery = "Select * from Win32_Process Where Name = '" & strProcessName & "'" ' WQL query string looking for the specified process
 
 Set objNameSpace = GetObject("winmgmts://./root/cimv2")    ' The cimv2 namespace of the local machine
 
 FindProcessID = vbFalse
 Set objProcessSet = objNameSpace.ExecQuery(strQuery)     ' Execute the query
 For Each objProcess In objProcessSet      ' For each process in the set, ordered by oldest to newest
  intProcessID = objProcess.ProcessID
  FindProcessID = True
 Next
 
 Set objNameSpace = Nothing: Set objProcessSet = Nothing: Set objProcess = Nothing
End Function
Pour le Pause voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Pause(ByVal nSecond As Single)
Dim t0 As Single
     'temps de référence
     t0 = Timer
     'boucle d'attente
     Do While Timer - t0 < nSecond
           Dim dummy As Integer
           dummy = DoEvents()
           'si on dépasse minuit,il faut
           'retrancher un jour
           If Timer < t0 Then
               t0 = t0 - 24 * 60 * 60
           End If
     Loop
End Sub
Mon soucis, c'est que j'arrive à envoyer des touches au programme, mais pas des touches comme "Enter(return)" ou Tabulation...
Tout est transmis en caractère pur et dur donc si je veux envoyer un "{TAB}" le programme recevra une chaine String et non pas une commande...

Je le sais car si je place le curseur sur un champ texte, je vois apparaitre le texte...

Une idée?
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h00   #14
Membre régulier
 
Inscription : janvier 2003
Messages : 254
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 254
Points : 76
Points : 76
Bonjour,
As tu essayé d'utiliser WinParrot ? (Qui peut automatiser des taches sur Windows... en code)
http://winparrot.fr/
comme de bien entendu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 17h45   #15
Membre actif
 
Inscription : janvier 2007
Messages : 915
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 915
Points : 185
Points : 185
J'ai la solution!!!

Vu comme j'ai galeré, il ne serait pas possible de mettre ca quelque part dans la faq ? Il y a une partie citrix ou pas?

Je post ca bientot!
jojo86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h20.


 
 
 
 
Partenaires

Hébergement Web