IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Automatiser l'ouverture d'un fichier compatible Excel depuis le Web (téléchargement)


Sujet :

Contribuez

  1. #41
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut Patrick !

    De mon côté sous la version 2003 ta version csv de ton dernier post mouline sans fin,
    rien ne se passe après l'ouverture du bandeau, obligé de forcer la fermeture d'Excel comme il n'y a plus de DoEvents !

    Idem pour la version xls, plusieurs essais pour chacune, OK avec mes versions mais,
    comme le site a encore l'air de ramer, je tenterais de nouveau un autre jour avec en plus une version 2007
    (déjà tenté en fait vite fait la semaine dernière mais déjà même souci et site aussi un poil lent) …

    @+

    __________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  2. #42
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour Patrick, Marc,

    même résultat que Marc de mon côté.
    Le problème est que le temps de réponse à euronext.com peut être long et que ce n'est pas uniquement avec des Sleep que cela peut le faire.
    Il manque également des déclarations de constante pour les API.

    Concernant l'utilisation de FindWindow le nom de la fenêtre ne semble pas être le bon (en tout cas chez moi). J'ai donc simplement travaillé avec sa classe.
    De plus cela ne te ramène pas la bonne fenêtre (ce n'est pas celle du bandeau).
    Il te faut utiliser FindWindowEx pour ramener son identifiant.

    Pour gérer l'attente de l'apparition (et donc la capture) de ces fenêtres l'utilisation de boucles me semblent plus appropriée.
    J'ai repris ton code vite fait (donc à optimiser) et je l'ai testé avec succès sur un Excel 2007=Windows7 et un Excel 2010 64 bits+Windows7.
    Après je pense qu'il faudrait utiliser un timer dans les boucles par sécurité.

    J'ai simplement inséré dans la fonction DemoEuroNext_all_format la gestion des fenêtres et de l'envoi des touches de clavier.

    A+

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #If Win64 Then  Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
      Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
      'Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
      Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
      (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    #Else
      Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
      Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
      'Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
      Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
      (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    #End If
     
     
    Const VK_TAB As Long = &H9
    Const KEYEVENTF_KEYUP As Long = &H2
    Const VK_RETURN As Long = &HD
     
     
    Const URL = "https://www.euronext.com/fr/popup/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A1006ef55d4998cc0fad71db6a6f38530"
    Dim OK%
     
     
    Dim eXtention
    Dim wbkname As String
     
     
    Sub euronext_csv()
        DemoEuroNext_all_format 1, ".csv", 1
    End Sub
     
    Sub euronext_xls()
        DemoEuroNext_all_format 1, ".xls"
    End Sub
     
    Function DemoEuroNext_all_format(mode, eXt, Optional separ)
    Dim hWnDEuronext As Long
    Dim hWnDbandeau As Long
     
     
    ' on choisi l'extention xls
        Const EG = "edit-go"
        eXtention = eXt
       wbkname = Environ("USERPROFILE") & "\Downloads\Euronext_Equities_EU_" & Format(Date, "yyyy-mm-dd") & eXtention
       With CreateObject("InternetExplorer.Application")
            .Navigate URL
            .Visible = True
     
            While .busy Or .ReadyState < 4: DoEvents: Wend
            OK = IsObject(.Document.all(EG))
            If OK Then
                Select Case eXt
                Case ".xls": .Document.all("edit-format-1").Checked = True
                Case ".csv"
                    .Document.all("edit-format-2").Checked = True
                    Select Case separ
                        'le document.all ne fonctionnant pas avec le id comme reference j'utilise le getelementbyid(difference entre moi et marc )
                        ' probleme recurent entre les versions de IE
                    Case 1: .Document.getelementbyid("edit-decimal-separator-1").Checked = True
                    Case 2: .Document.getelementbyid("edit-decimal-separator-2").Checked = True
                    End Select
                End Select
     
                .Document.all(EG).Click
                 ' affiche la fenetre avnt d'appuyer sur les bouton du bandeau de telechargement (facultaif ) fonctionne meme sans
     
                Do
                  DoEvents
                  hWnDEuronext = FindWindow("IEFrame", vbNullString)
                Loop While hWnDEuronext = 0
     
                Do
                  DoEvents
                  hWnDbandeau = FindWindowEx(hWnDEuronext, 0&, "Frame Notification Bar", vbNullString)
                Loop While hWnDbandeau = 0
     
     
                Sleep 500
     
                keybd_event VK_TAB, 0, 0, 0&
                keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
                keybd_event VK_TAB, 0, 0, 0&
                keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
                keybd_event VK_RETURN, 0, 0, 0&
                keybd_event VK_RETURN, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
     
     
    '            .Quit
            Else
                .Quit: Beep
            End If
        End With
    End Function

  3. #43
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    n'importe quoi !!

    les sleep ne servent qu'a reposer l'uc car un boucle do loop sur l'api findwindows surcharge un peut la beca ne c'est tout
    et oui la fenêtre n'ai pas la bonne mais celle que je manipule est présente des que le bandeau de téléchargement est la c'est la fenêtre de téléchargement qui t'affiche après avoir cliquer sur enregistrer les derniers téléchargement
    sauf qu'elle est vide et en hidden tant que l'on a pas choisi ouivrir ou enregistrer mais qu'importe ca te donne le signal que le bandeau est la

    chez moi ca fonctionne a merveille
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #44
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut





    davido84, cela ne fonctionne pas plus de mon côté avec la version 2003 … Je suis sous IE9, toi ?

    Je testerais aussi ton code comme celui de Patrick avec une version 2007 …


    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #45
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hWnDEuronext = FindWindow("IEFrame", vbNullString)
    déjà avec enumwindow elle n'existe pas chez moi ca risque pas de fonctionner

    j'ai oublié de préciser que ca fonctionnait qu'a partir de la dernière version de IE 9!!!!!!!! je dis bien la dernière car pour la 9 il y en a plusieurs
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #46
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    incognito chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Do
                  DoEvents
                  hWnDEuronext = FindWindow("IEFrame", vbNullString)
                Loop While hWnDEuronext = 0
     
                Do
                  DoEvents
                  hWnDbandeau = FindWindowEx(hWnDEuronext, 0&, "Frame Notification Bar", vbNullString)
                Loop While hWnDbandeau = 0
    tourne sur
    office 2007 32 bits
    IE 10 32/64 bits
    ni l'une ni l'autre comme ca c'est réglé

    je te parle meme pas de la mémoire que ca prend mes fenêtres deviennent toutes blanches
    j'ai pourtant un sacré bourrin
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #47
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    et je Drais même mieux
    quitte a chercher la fenêtre enfant autant continuer sur cette lancée chercher les boutons qui sont les enfants da la barre de not......

    et plutôt qu'utiliser la simulation de touche
    utiliser l'api" sendmessage" sue les boutons
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #48
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bon je viens d'essayer sur un vieil ordi avec XP et IE 9 ca fonctionne mais attention au sleep on est limite

    mais sur Windows 7 et IE 10 choux blanc
    par contre avec ma méthode sur la fenêtre de téléchargement ca fonctionne sur les deux (W7/Xp)
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #49
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    encore une fois comme je le precise dans mon exemplaire avec ma méthode le Doevents ne sert quazi a rien dans les boucles do loop sur les handles

    je les remplaces par des petit sleep d'où mon intervention toute a l'heure qui disait on est limite avec les sleep

    mais en fait c'est les "Doevents qui ne sont pas suffisamment efficaces avec les apis

    je dirais presque que c'est normale l'api étant complètement indépendante de l'app Excel sa réponse n'est prise en compte qu'une fois 2 fois sur 3

    d'où mes sleep afin de laisser reposer Nestor (le nom de mon ordi)afin qu'il puisse recevoir et intégrer le long en retour de l'api
    ensuite pour les touche je comprend pas bien pouquoi tu integre le key down et le key up d'ailleurs le key up ne fonctionne pas très bien en vba c'est connu
    Alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     Do
                 Sleep 30
                  hWnDEuronext = FindWindow("IEFrame", vbNullString)
                Loop While hWnDEuronext = 0
     
                Do
                 Sleep 30
                  hWnDbandeau = FindWindowEx(hWnDEuronext, 0&, "Frame Notification Bar", vbNullString)
                Loop While hWnDbandeau = 0
     
     
                Sleep 300
     ' ici je vais essayer d'intégrer le captage des boutons (findwindowex) et un send message(Api)  mais pas ce soir je suis fatigué
                keybd_event VK_TAB, 0, 0, 0&
               ' keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 50
                keybd_event VK_TAB, 0, 0, 0&
               ' keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 50
               keybd_event VK_RETURN, 0, 0, 0&
                'keybd_event VK_RETURN, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
     
     
    .Quit' si les doevents dans les (do/loop(Api) ne sont pas remplacé par des sleep ca ferme IE trop tôt 
            Else
                .Quit: Beep
            End If
        End With
    End Function
    voila


    puré maintenant c'est le focus qui est perdu
    allez on reprend le showWindow
    et apres le le sleep 300
    showWindow hWnDbandeau,9
    Pour info
    Constante Valeur Définition
    SW_HIDE 0 Cache la fenêtre et en active une autre.
    SW_MAXIMIZE 3 Agrandit la fenêtre.
    SW_MINIMIZE 6 Réduit la fenêtre et active la prochaine (dans l'ordre des tâches windows).
    SW_RESTORE 9 Active et affiche la fenêtre à sa taille et position initiales.
    SW_SHOW 5 Active et affiche la fenêtre.
    SW_SHOWMAXIMIZED 3 Active et agrandit la fenêtre.
    SW_SHOWMINIMIZED 2 Active et réduit la fenêtre.
    SW_SHOWNA 8 Identique à SW_SHOW sauf que la fenêtre n'est pas activée.


    davido je te doit milles excuses

    en effet je viens de m'apercevoir que toi tu cherche le handle par le classename et moi le caption forcement avec seven ca ne fonctionnait pas maintenant oui
    avec XP SP3 ls deux fonctionne dans l'ordre et vice et versa

    alors un coup de bâte pour moi et un point pour toi

    findWindow( classname,vbnullstring ou vbnullstring,caption) purré je suis un boulet

    Mais pour finir préférer des petit sleeps au doevents et un petit showWindow ne mange pas de pain sur le handle du bandeau
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #50
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Marc :
    davido84, cela ne fonctionne pas plus de mon côté avec la version 2003 … Je suis sous IE9, toi ?

    Je testerais aussi ton code comme celui de Patrick avec une version 2007 …
    Testé sous IE9 et IE11 et dans les deux cas :
    Nom : screenshot.16.png
Affichages : 403
Taille : 9,7 Ko

    Test en plaçant un point d'arrêt sur le 1er keybd_event. Si la procédure s'arrête au moment où le bandeau apparaît c'est que c'est bon et que le reste n'est que du détail à peaufiner puisque le but de la manœuvre est de faire correspondre l'envoi des touche du clavier au bon moment.

    Patrick:

    hWnDEuronext = FindWindow("IEFrame", vbNullString)
    déjà avec enumwindow elle n'existe pas chez moi ca risque pas de fonctionner


    Bizarre car tu dis cela et dans ton dernier message tu dis que cela fonctionne donc si cela fonctionne c'est que les fenêtres existent sinon cela ne fonctionnerait jamais.

    Si tu places un point d'arrêt à la sortie de la 1ère boucle et que la procédure passe ce stade...c'est bien que la fenêtre existe (et idem pour la seconde) !

    Voici pour les fenêtres:
    Nom : screenshot.18.png
Affichages : 422
Taille : 8,5 Ko

    La classe de la fenêtre euronext est bien "IEFrame" et le caption "Please specify the download format | Euronext - Internet Explorer"
    Tu peux te permettre de n'utiliser que la classe dans ce cas mais on peut aussi utiliser les 2 dans FindWindow.

    Et pour le bandeau la classe est bien "Frame Notification Bar" (constate-le toi-même c'est noté juste en dessous celle d'euronext).

    bon je viens d'essayer sur un vieil ordi avec XP et IE 9 ca fonctionne mais attention au sleep on est limite
    Ce n'est qu'un détail. Je te livre l'idée à toi d'adapter.

    et je Drais même mieux
    quitte a chercher la fenêtre enfant autant continuer sur cette lancée chercher les boutons qui sont les enfants da la barre de not......

    et plutôt qu'utiliser la simulation de touche
    utiliser l'api" sendmessage" sue les boutons
    Oui sauf que dans ce cas je ne pense pas que ce soit jouable car je ne ramène pas l'identifiant de ces boutons.
    Mais si toi tu les obtiens fais-le c'est mieux. Est-ce que tu les obtiens de ton côté ?

    A+
    David

  11. #51
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    regarde mon dernier post il y a l'explication
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #52
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    davido je te doit milles excuses

    en effet je viens de m'apercevoir que toi tu cherche le handle par le classename et moi le caption forcement avec seven ca ne fonctionnait pas maintenant oui
    avec XP SP3 ls deux fonctionne dans l'ordre et vice et versa
    Le fait de chercher le handle via sa classe me semble préférable dans ce cas car le handle du bandeau n'a pas de caption, uniquement un nom de classe ("Frame Notification Bar"). Donc en travaillant également sur la classe tu peux atteindre des handle que tu ne pourrais pas obtenir en utilisant uniquement le caption.
    Or dans le cas présent il me paraît absolument primordial
    de rechercher précisément le handle du bandeau et non seulement celui de la fenêtre euronext ou un autre car l'utilisation des keybd_event (ou de SendKeys si l'on préfère) doit absolument être calée après l'apparition du bandeau (sinon je ne vois aucun intérêt à l'utilisation d'API).

    Sur le fait d'utiliser
    ShowWindow pourquoi pas mais personnellement je l'utiliserais avant tout sur la fenêtre d'euronext pour la raison suivante : la difficulté à prendre en compte dans le cas présent est le temps de téléchargement du site qui peut varier de rapide à très lent. Si ce temps est long l'utilisateur peut être amené à modifier la taille de la fenêtre euronext. Fais le test toi-même en la réduisant au maximum dans sa largeur tout de suite après son affichage et tu verras que même en utilisant ShowWindow sur le bandeau avec la constante que tu veux les keybd_event tombent à côté.

    D'où la nécessité de l'utiliser d'abord sur la fenêtre euronext, quitte à restaurer sa taille après.
    et dans ce cas l'utilisation de ShowWindow peut effectivement être une sécurité au cas où (sinon l'utilisation de l'API SetForegroundWindow suffirait).

    Dans le code initial la 1ère boucle do loop sur la recherche du handle d'euronext n'est pas vraiment utile car sur le principe la page est affichée.
    Par contre celle sur le bandeau est primordial car sinon tu pourras utiliser tous les sleep que tu veux ce sera toujours aléatoire vu que le temps de téléchargement varie.

    Ce qui pourrait donner par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
                hWnDEuronext = FindWindow("IEFrame", vbNullString)
     
                Do
                  DoEvents
                  hWnDbandeau = FindWindowEx(hWnDEuronext, 0&, "Frame Notification Bar", vbNullString)
                Loop While hWnDbandeau = 0
     
                'par sécurité on passe l'affichage d'euronext en plein écran au cas où l'utilisateur l'aurait réduite au maximum
                ShowWindow hWnDEuronext, SW_SHOWMAXIMIZED
     
                Sleep 500
     
                keybd_event VK_TAB, 0, 0, 0&
                keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
                keybd_event VK_TAB, 0, 0, 0&
                keybd_event VK_TAB, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
                keybd_event VK_RETURN, 0, 0, 0&
                keybd_event VK_RETURN, 0&, KEYEVENTF_KEYUP, 0&
                Sleep 100
     
                'on restaure la taille d'euronext à celle choisie par l'utilisateur
                ShowWindow hWnDEuronext, SW_RESTORE
    Quant à l'utilisation des KEYEVENTF_KEYUP je me souviens avoir eu des problèmes en ne l'utilisant pas. Maintenant si cela fonctionne sans et qu'en VBA cela ne sert à rien et bien enlève-les.

    Et pour finir je ne pense pas que tu puisses capter le handle du bouton et lui envoyer un clic via SendMessage car personnellement je ne capte aucune info sur ce bouton.

    Il y aurait d'autres moyens détournés que tu pourrais peut-être utiliser si tu veux cliquer spécifiquement sur le bouton (utilisation des API
    ClientToScreen, SetCursorPos, mouse_event, etc. permettant un clic gauche de la souris sur le bouton à condition d'arriver à le localiser indirectement mais de façon sûre), mais pas directement via un SendMessage car pour cela il te faut le handle spécifique du bouton.

    Maintenant si tu peux le faire montre moi cela m'intéresse car c'est vrai que ce serait mieux.


    A+
    David

  13. #53
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonsoir Davido et MarcL

    le seul enfant du bandeau de téléchargement que je trouve

    sa classname=DirectUIHWND
    son handle=591118

    pas de captions ,pas de getwindowtext

    serait ce une fenêtre fille et les contrôles serait a l'intérieur ???????
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #54
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonsoir Patrick,
    le handle que tu ramènes est celui que tu peux voir sur la capture d'écran que je t'ai fournie dans mon avant-dernier message. Et cette fenêtre ne contient aucun contrôle.
    C'est pour cela qu'à mon avis tu ne peux accéder directement au bouton "Enregistrer" et utiliser SendMessage.
    A+

  15. #55
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    je cherche
    j'ai pourtant trouvé encore des sub enfant de la fenêtre fille

    classe frame tab
    classe client caption
    et cela avec une vieille api (GetWindow)
    exemple
    ajoute cet api
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function GetWindow Lib "user32"  (ByVal hwnd As Long,   ByVal wCmd As Long) As Long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox GetWindow(hWnDEuronext,5)' te donne le handle la "Frame Notification Bar"
    un simple test avec l'api getclassname te le confirme et en descendant comme ca jusqu'à client caption
    pour info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Const GW_HWNDFIRST = 0
    Public Const GW_HWNDLAST = 1
    Public Const GW_HWNDNEXT = 2
    Public Const GW_HWNDPREV = 3
    Public Const GW_OWNER = 4
    Public Const GW_CHILD = 5
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #56
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,

    le problème vient du fait que tu ne travailles pas sur la bonne fenêtre : tu travailles sur celle d'euronext alors qu'il te faut travailler sur celle du bandeau.

    Si l'on veut être précis il y a 3 handle à prendre en compte (regarde la capture d'écran que j'avais fournie) :
    - celui d'euronext (classe IEFrame)
    - celui du bandeau (Frame Notification Bar)
    - celui à l'intérieur du bandeau (classe DirectUIHWND)

    Le 3ème handle ne contient rien, c'est pour cela que je travaille avec le Frame Notification Bar car cela suffit pour atteindre le bandeau dans le cas présent.

    Si tu recherches les fenêtres ayant un lien avec Frame Notification Bar GetWindow te ramènera effectivement d'autres handles mais uniquement celles qui ont la relation précisée dans la constante utilisée. Mais parmi toutes les fenêtres ramenées seule GetWindow(hWnDbandeau, GW_CHILD) a un lien direct avec le bandeau et c'est précisément celle à l'intérieur du bandeau (classe DirectUIHWND).
    Les autres ne sont que les handles qui ont la relation précisée par la constante dans l'ordre de l'ensemble des handles existant à ce moment-là (c'est bien précisé dans les explications trouvées concernant cette API).
    GW_HWNDFIRST ramène le handle du bandeau
    GW_HWNDLAST ramène un handle correspondant à une classe Frame Tab qui n'a rien à voir avec le bandeau mais qui est simplement la dernière fenêtre au même niveau d'arborescence que le bandeau
    etc.

    Et quand tu fais ces mêmes tests avec le 3ème handle (celui à l'intérieur du bandeau) GetWindow couplé aux constantes GW_HWNDFIRST et GW_HWNDLAST te ramènent le même handle (normal puisque qu'il n'y a pas d'autre fenêtre à ce même niveau d'arborescence) et GW_CHILD te ramène 0...preuve qu'il n'y a pas de fenêtre enfant arrivé à ce stade.

    A+
    David

  17. #57
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Davido
    oui l'exemple que j'avais donné travaillait avec le hwnd de Euronext
    mais j'avais fait les tests aussi sur le handle du Bandeau et je tombe bien sur cette fenêtre enfant mais en effet il y a rien dedans du moins pas accessible comme ca

    par contre avec getwindows les long renvoyé ne sont pas les mêmes qu'avec findwindow ou findwindowex

    pourtant avec la getclassname quand je teste les long retourné par getwindow j'ai bien leur bonne classe

    c'est étonnant et bizarre surtout

    mais les boutons existent alors pour moi on doit les trouver d'une manière ou d'une autre

    peut être qu'après les api sur handle il faut utiliser un autre system
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #58
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    par contre avec getwindows les long renvoyé ne sont pas les mêmes qu'avec findwindow ou findwindowex

    pourtant avec la getclassname quand je teste les long retourné par getwindow j'ai bien leur bonne classe

    c'est étonnant et bizarre surtout
    Sur quel handle tu testes quand tu compares ces long ?

    Le plus simple est que tu postes le code de ton test pour que je puisse le tester chez moi parce que sinon je ne peux te répondre avec précision.

    A+

  19. #59
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bon galèrant avec des handles incohérents
    je me suis fait un petit outil
    un listeur dans le debug.print des enfants d'une fenetre passé en parametre avec enumchildwindow
    et la je m'aperçois que des enfa
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #60
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bon galèrant avec des handles incohérents
    je me suis fait un petit outil<br>un listeur dans le debug.print des enfants d'une fenetre passé en parametre avec enumchildwindow
    et la je m'aperçois que des enfants n'était pas trouvé avec findwindowex
    cela dis je ne suis pas sur que cela soit cohérent
    voila le code de mon outils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
     Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
     Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
      Declare Function EnumChildWindows Lib "user32" (ByVal hwndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
     Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
     Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     
    Sub test()
    Dim hwndIE As Long
     'hwndIE = FindWindow("IEFrame", vbNullString)
    'hwndIE = FindWindow("Frame Notification Bar", vbNullString)            'enfant de IEFrame
     'hwndIE = FindWindow("Progman", vbNullString)                          'enfant de Frame Notification Bar
    'hwndIE = FindWindow("SysListView32", vbNullString)                     'enfant de Progman
    'hwndIE = FindWindow("SysHeader32", vbNullString)                       'enfant de Progman
    'hwndIE = FindWindow("SHELLDLL_DefView", vbNullString)                  'enfant de Progman
    hwndIE = FindWindow("DirectUIHWND", vbNullString)                      'enfant de Frame Notification Bar non trouvé avec enumchildwindow  ??????
    'hwndIE = FindWindow("CicLoaderWndClass", vbNullString)                 'enfant de DirectUIHWND non trouvé avec findwindowex
    Dim Alister As Long ' return value
    Alister = EnumChildWindows(hwndIE, AddressOf EnumChildProc, 0)
    End Sub
     
    Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim Nbfenetre, fenetre
     Nbfenetre = Nbfenetre + 1 'nombre de fenetre +1
    fenetre = "*******************************************************" & vbCrLf
    fenetre = fenetre & " son handle = " & hwnd & vbCrLf
    fenetre = fenetre & "sa caption est : " & lCaption(hwnd) & vbCrLf
    fenetre = fenetre & "sa caption intermediaire est : " & lCaption2(hwnd) & vbCrLf
    fenetre = fenetre & " sa classe est : " & classe(hwnd) & vbCrLf
    fenetre = fenetre & "*******************************************************"
    Debug.Print fenetre
    EnumChildProc = 1 ' continue enumeration
    End Function
    Function lCaption(pointeur) As String 'titre du document
    lCaption = String(100, Chr$(0))
    GetWindowText pointeur, lCaption, 100
    lCaption = Left$(lCaption, InStr(lCaption, Chr$(0)) - 1)
    End Function
    Function classe(pointeur) As String 'classe de la fenetre
    classe = String(100, Chr$(0))
    GetClassName pointeur, classe, 100
    classe = Left$(classe, InStr(classe, Chr$(0)) - 1)
    End Function
    Function lCaption2(pointeur) As String 'texte titre fenetre
    Dim nbcar
    lCaption2 = String(100, Chr$(0))
    nbcar = SendMessage(pointeur, &HD, 100, ByVal lCaption2)
    lCaption2 = Left$(lCaption2, InStr(lCaption2, Chr$(0)) - 1)
    End Function
    j'ai l'impression que enuchildwindow ne fait pas la différence entre fille et sœur
    Davido tu veux bien regarder cela je pette les plombs La
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Forcer l'ouverture d'un fichier avec Excel
    Par Cda01 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2011, 15h47
  2. [XL-2003] Ouverture d'un fichier par excel en 3 exemplaires
    Par basto dans le forum Excel
    Réponses: 1
    Dernier message: 25/08/2009, 17h05
  3. ouverture d'un fichier avec excel sous vs.net 2003
    Par lesultan2007 dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/07/2009, 15h46
  4. Telecharger un fichier excel depuis le web via PERL
    Par ptimos93800 dans le forum Web
    Réponses: 3
    Dernier message: 19/03/2009, 18h38
  5. [vbexcel]automatiser l'ouverture d'un fichier
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/12/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo