Vb.net 2010 faire copier/coller dans un webbrowser

Résolu
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 - 13 nov. 2010 à 23:50
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 - 14 nov. 2010 à 20:06
bonjour

ne trouvant rien et n'arrivant pas mieux je me tourne vers vous pour vous soumettre le problème que je rencontre :

dans une forme principale j'ai un webbrowser et j'ai besoin d'y récupérer des informations en passant par un control A (pour tout sélectionner) et un control C pour mettre le contenu dans le presse-papier

Or j'ai beau faire dans l'évènement webbrowser1_DocumentCompleted :

webbrowser1.Document.Focus()
SendKeys.Send("^A^C")

rien ne se passe mais si je mets un msgbox après le sendkeys ca me fait un copier/coller de la fenetre du msgbox ?

Alors pourquoi le sendkeys ne s'applique t'il pas au webbrowser ?

par contre si je clique sur le webbrowser et je fais CTRL A et après CTRL C à la mano là ça marche

Merci pour votre aide


bidouille007

19 réponses

Utilisateur anonyme
14 nov. 2010 à 16:11
Et que disent StatusText et DocumentTitleChanged ?
Private Sub WebBrowser1_StatusTextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles WebBrowser1.StatusTextChanged
    Debug.Print(WebBrowser1.StatusText)
End Sub
Private Sub WebBrowser1_DocumentTitleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles WebBrowser1.DocumentTitleChanged
    Debug.Print(WebBrowser1.Document.Title)
End Sub

Si le StatusTexte à changé c'est que l'utilisateur a fait quelque chose en principe.
3
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 00:44
j'ai même mis

webbrowser.focus()

et webbrowser.bringtofront()

et ca ne change rien

bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 11:51
Bonjour,
Au lieu d'utiliser Sendkeys tu peux utiliser la fonction ExecCommand :
   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        WebBrowser1.Document.ExecCommand("SelectAll", False, Nothing)
        WebBrowser1.Document.ExecCommand("Copy", False, Nothing)
    End Sub

Il y a une longue liste des commandes applicables à cette fonction que tu peux consulter ici
A bientôt.
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 12:04
Merci Banana32

j'avais trouvé ca cette nuit mais ca ne marche pas quand l'utilisateur est dans une zone puisque le selectall ne s'applique alors qu'à cette zone alors que je souhaite avoir tout l'écran.

Je ne m'explique pas que cela soit si compliqué que ca pour faire un control A et un control C puisque l'information diffère de webbrowser.documenttext et webbrowser.documentstream.


bidouille007
0

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

Posez votre question
Utilisateur anonyme
14 nov. 2010 à 13:06
Quel style d'information veux-tu récupérer sur cette page ?
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 13:30
je suis pas un expert en html ou javascript mais en fait je ne souhaite pas récupérer le code qui permet l'affichage mais la résultante, car lors de la présence de code, je récupère le code mais pas ce que je vois à l'écran, d'ou mon essai de faire un ctrl A et ctrl C qui contient ce que je cherche à récupérer.

de mes essais nocturnes et hélas infructueux puisque si l'utilisateur entre dans un champ je ne récupère que le contenu du champ alors qu'il me faut la totalité de la page de façon à traiter de la même manière chaque capture et surtout avoir ce qu'il faut dans la capture.

j'ai essayé ca aussi:

Dim gogo As String = surf.Document.ActiveElement.InnerText 
If gogo <> Nothing Then Clipboard.SetText(gogo)
        gogo = surf.DocumentType
        If gogo <> Nothing Then Clipboard.SetText(gogo)
             If gogo = Nothing Then
            ' si je fais Unselect qui après ne permets de ne plus rien séléctionner donc à exclure
            surf.Document.ExecCommand("Unselect", False, Nothing)
            ' si l'utilisateur clique dans un champ le selectall ne s'applique que sur le contenu du champs
            surf.Document.ExecCommand("SelectAll", False, Nothing)
            surf.Document.ExecCommand("Copy", False, Nothing)
     '    OU mais pour saveas s'affiche une boite de dialogue pourtant ca ca marche dans tous les cas mais à exclure puisque boite de dialogue
            surf.Document.ExecCommand("SaveAs", False, "c:\testog.txt")
        End If


pardon pour la façon de présenter le code mais comme ca ne marche pas c'est un brouillon.


bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 13:50
Il y a un truc qui ne colle pas.
Dans ton premier post tu cherche à copier la page lors du DocumentCompleted
L'utilisateur ne peut donc pas encore taper quelque chose.
je ne souhaite pas récupérer le code qui permet l'affichage mais la résultante

Résultante de quoi ?
mais pas ce que je vois à l'écran

Que s'est-il passé entre l'affichage de la page et ce que tu souhaite extraire ?
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 14:07
tu as raison l'utilisateur n'a pas la main et donc il ne peut pas encore rentrer dans un champ

mais ca m'embête car pour que le système marche il faudrait que je pilote le site via une interface à faire et donc de reproduire toute l'interface du site pour envoyer les commandes à traiter mais là encore je suis pas sur que ca marchera puisque si c'est pas l'utilisateur qui entre dans le champ ca va être moi par du code et donc revenir au point de départ.

c'est un peu comme une variable que tu mets pour afficher un mot dans un msgbox ou si tu mets directement le mot que tu veux affiché, dans l'un tu récupere le nom de la variable et dans l'autre le mot affiché je suppose qu'en htlm, javascript ou php ca doit être pareil.

ca serait cool de pouvoir cliquer sur le background (un endroit ou il n'y a rien) du webbrowser ainsi le selectall marcherai mais là j'ai pas trouvé pour faire ca.




bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 14:18
Si l'utilisateur valide un formulaire par exemple, tu peux peut-être (si l'url est modifiée) te servir de l'url (e.Url ) de l'événement DocumentCompleted pour réaliser des conditions en copiant la page à ce moment là.
Ou bien, si le code source de la page résultante à changé, venir lire une partie de ce code qui te permettra d'identifier la page et de la copier si besoin.
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 14:23
je teste la chose tout de suite


bidouille007
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 15:39
bonne idée mais l'événement downloadcompleted ne se produit pas systématiquement donc y a t'il un événement à la suite d'un clic sur le webbrowser ou bien va t'il falloir faire un truc à la volée ?

bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 16:30
Sinon la dernière solution, si tu connait le nom du bouton par exemple ou l'utilisateur va cliquer tu peux détecter un clic sur ce bouton ou des tas d'autre choses en ajoutant un Handler sur cet élément.
Exemple avec le bouton rechercher de google :

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        WebBrowser1.Navigate("http://www.google.fr")
    End Sub


    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim el As HtmlElement = WebBrowser1.Document.GetElementById("btnG")
        AddHandler el.Click, AddressOf Test
    End Sub

    Private Sub Test()
        MessageBox.Show("click")
    End Sub


Ensuite, tu n'aura plus qu'à copier la page.
Tu testera et me dira si ça marche.
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 16:33
j'avais effectivement ajouté pour tester un event click sur le webbrowser

mais il semble que cela ne fonctionne pas avec tous les boutons du moins dans la manière dont se charge le site sur lequel je fais les tests.

là je suis sur statustextchanged je crois que c'est prometteur

bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 16:46
Il s'agit de placer l'handler non pas sur le browser mais sur un bouton bien précis. (GetElementsByTagName est aussi une solution à envisager)
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 16:47
tellement prometteur que dès que je bouge dans le webbrowser l'événement à lieu

je vais donc jongler sur les différences entre les 2 urls celui du webbrowser accessible à l'utilisateur et le deuxième qui lui restera caché pour faire les copier/coller qui s'imposent.

y aurait pas un moyen de faire une copie du 1er webbrowser dans le second afin de gagner du temps dans le chargement des pages et les décalages qui pourraient en découlé. car finalement je charge deux fois les pages ?

Merci de ton aide Banana32, cela m'a sorti pour l'instant de l'impasse, je te tiens au courant bien sur

bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 17:07
En général StatusText indique "Terminé" lorsque les opérations ont été traitées. Pourquoi ne pas valider ton collage à ce moment là ?
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 17:19
à priori statustextchanged est un événement provoqué par le moindre mouvement de souris (en fonction de la richesse de la page bien sur) dans le webbrowser ce qui ferait quelque chose de bien trop répétitif

sinon je reste preneur pour copier le contenu du webbrowser n°1 sur le n°2, car sinon je charge les pages deux fois, mais si y a pas moyen je ferai avec, de nos jours avec l'adsl

encore merci Banana32

bidouille007
0
Utilisateur anonyme
14 nov. 2010 à 17:41
De rien
Sans savoir à quoi ressemble ce site et ce que tu veux y récupérer, ce n'est pas simple. Je suis sûr qu'il y a moyen de faire plus simple que d'utiliser un second browser. A mon avis, la solution du GetElementsByTagName ou GetElementByID ou Document.All etc... couplée avec StatusTextChanged devrait suffire.
N'oublie pas de dormir
Bonne soirée.
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 nov. 2010 à 20:06
oui dormir j'y penserai cette nuit

Bonne Nuit à toi

bidouille007
0
Rejoignez-nous