none
Alternative à sendkeys RRS feed

  • Discussion générale

  • Bonjour,

    Je cherche depuis plusieurs jours une alternative à Sendkeys.

    Je veux envoyer un nombre sur une zone input dans un webbrowser

    Si j'utilise .SetAttribute("value", 3) la zone est bien mise à 3 mais cette zone devrait mettre à jour une autre valeur sur la page web et ça ne se produit pas.

    Il faut que j'utilise soit une entrée au clavier, soir la fonction sendkeys qui pose des problèmes si le focus n'est pas bon ou si l'écran de veille est activé.

    C'est pourquoi j'ai besoin d'une alternative qui simule une entrée au clavier. Le calcul se produit lorsque la touche est relâchée.

    J'ai essayer avec sendmessage sur le handle du webbrowser mais je n'y suis pas arrivé.

    Quelqu'un peut-il m'aider ?

    Merci.


    MCh


    samedi 2 septembre 2017 19:22

Toutes les réponses

  • En mettant le focus en même temps, ça ne marche pas ?

    Par exemple, avec la page Google, ça valide bien l'entrée après avoir mis la valeur et le focus :

    Dim hec As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
    For Each he As HtmlElement In hec
        Dim sName As String = he.GetAttribute("Name").ToString
        If sName = "q" Then
            he.SetAttribute("Value", "Test")
            he.Focus()
        End If
    Next
    SendKeys.Send("{Enter}")

    (et je n'ai pas re-testé, mais l'écran de veille se resettait par le classique mouse_event

    ou sinon on peut toujours le désactiver/réactiver par SystemParametersInfo )

    • Modifié Castorix31 dimanche 3 septembre 2017 09:13
    dimanche 3 septembre 2017 08:59
  • Bonjour,

    Non ça ne fonctionne pas dans toutes les conditions.

    Il suffit que le focus soit changé par une autre appli ou que l'écran de veille soit activé pour que ça ne marche pas.

    Je viens de trouver la solution que je vous mets ci-dessous. (trouvée dans des archives de 2006)

     Private Declare Sub keybd_event Lib "user32" (
         ByVal bVk As Byte,
         ByVal bScan As Byte,
         ByVal dwFlags As Integer,
         ByVal dwExtraInfo As Integer)
    
        Const KEYEVENTF_KEYUP = &H2 ' Relache la touche
        Const Droite As Integer = 51
        Sub Change_Value(M As Byte)
            Dim s = WB.Document.Body.GetElementsByTagName("input")
            Dim A$ = ""
            For Each d As HtmlElement In s
                A = d.GetAttribute("OuterHtml")
                Debug.Print(A)
                If InStr(A, "valeur_input") > 0 Then
                    d.Focus()
                    d.SetAttribute("value", M)
                    Application.DoEvents()
                    Call keybd_event(Droite, 0, 0, 0)
                    Call keybd_event(Droite, 0, KEYEVENTF_KEYUP, 0)
                    Exit For
                End If
            Next
        End Sub


    MCh

    dimanche 3 septembre 2017 11:25
  • Oui, ça met bien le focus à la ligne :

    d.Focus()

    Et il faut bien sûr mettre la fenêtre en Foreground

    (keybd_event() est similaire à SendKeys ou SendInput())


    dimanche 3 septembre 2017 11:35
  • Exacte !

    Mince, ça ne fonctionne toujours pas avec l'écran verrouillé.

    Fausse joie. Je retourne à ma recherche.


    MCh

    dimanche 3 septembre 2017 12:13
  • Exacte !

    Mince, ça ne fonctionne toujours pas avec l'écran verrouillé.

    Fausse joie. Je retourne à ma recherche.

    Le plus simple doit être avec mouse_event(), comme noté dans les différentes solutions de cet article

    pour empêcher l'exécution du screensaver en le resettant périodiquement

    dimanche 3 septembre 2017 12:55
  • Oui, j'ai désactivé le screensaver dans la base de registre et je fais attention de ne pas touché à mon PC pendant les moments critiques.

    Mais ce n'est qu'une solution de contournement du problème.

    Je ne désespère pas de trouver une vraie solution.


    MCh

    dimanche 3 septembre 2017 13:05