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

Delphi Discussion :

TWebbrowser: positionner la souris sur un mot d'une page Web


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut TWebbrowser: positionner la souris sur un mot d'une page Web
    Bonjour,

    j'affiche une page Web dans un TWebbrowser en plein écran.
    dans cette page, il y a un mot unique, mais qui n'est pas toujours au même endroit.
    je cherche une solution permettant de déplacer la souris sur ce texte (qui contient un lien URL mais avec des paramètres non accessibles)

    pour le déplacement de la souris, je sais faire,
    c'est la détection de la position du mot qui me pose une difficulté
    le CTRL F et ENTREE met le mot en surbrillance, mais ne déplace pas la souris, bien sûr..

    merci de votre aide

    @bientôt

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Pourquoi ces paramètres sont inaccessibles ?
    Serait-ce un JavaScript qui les génèrent et via le TWebBrowser InnerHTML tu n'a pas les moyens de les récupérer !

    Avant de poursuivre sur ton idée de recherche, ton lien est-ce qu'il a un ID pour le retrouver et simuler le click directement :
    Méthode pour simuler un clique sur un bouton d'une page HTML (Tcppwebbrowser) ou aussi CppWebBrowser submit


    Est-ce que tu arrives à lancer la recherche pas CTRL + F ?

    Disons que tu arrives déjà à faire cela avec du IHTMLDocument2.Selection puis Selection.createRange pour finir sur Range.findText comme dans ce sujet webbrowser et Find

    Si l'on ne se base que sur la surbrillance, tu pourrais chercher un pixel de la couleur de surbrillance avec un ScanLine sur GetDC(0)
    Après savoir si ce pixel appartient bien à la zone de texte en surbrillance ou à n'importe quoi d'autres à l'écran, ça se complique nettement !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Pourquoi ces paramètres sont inaccessibles ?
    Serait-ce un JavaScript qui les génèrent et via le TWebBrowser InnerHTML tu n'a pas les moyens de les récupérer !
    précisions utiles, il ne s'agit en aucune manière d'une tentative de piratage d'un site.
    mandaté, j'ai tous les droits d'autorisation d'utiliser toute technique pour récupérer certains fichiers.
    Ce site a été modifié sans concertation, à la hâte, suite à un changement d'équipe..
    du fait, de la situation économique et des congés, nous nous retrouvons désormais devant une difficulté qu'il faut résoudre.
    Voilà pour le cadre, mais au final, ça me donne l'occasion de faire un exercice original !

    Le lien sur le mot ne contient pas la vraie URL qui m'intéresse..
    la bonne est très facile à obtenir, il suffit de faire un clic-droit puis copier lien (dans cette URL il n'y a aucun paramètres visible, mais elle fonctionne lorsque à travers le site on se place sur un dossier)
    mais l'os est que les paramètres cachés sont stockés lorsqu'on utilise directement le navigateur mais pas avec le TWebbrowser.

    j'ai donc construit un robot qui exécute tous les clics utiles mais pour certains dossiers le mot clé se déplace dans la page (du à l'ajout de texte de longueur variable..) et du fait de ce ripage, mon clic ne fonctionne plus de temps en temps !

    Disons que tu arrives déjà à faire cela avec du IHTMLDocument2.Selection puis Selection.createRange pour finir sur Range.findText comme dans ce sujet webbrowser et Find

    Si l'on ne se base que sur la surbrillance, tu pourrais chercher un pixel de la couleur de surbrillance avec un ScanLine sur GetDC(0)
    Après savoir si ce pixel appartient bien à la zone de texte en surbrillance ou à n'importe quoi d'autres à l'écran, ça se complique nettement !
    effectivement, j'ai bien pensé à cette solution, bien qu'elle me parait un peu acrobatique.
    mais je m'aperçois que je ne vais pas avoir le choix.
    je vais donc continuer dans cette voie.

    en tout cas merci pour les infos et les liens.
    @bientôt

  4. #4
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut suite
    @ShaiLeTroll

    j'ai avancé un petit peu..
    la couleur de la zone en surbrillance est : Lime, soit R = 0, V = 255 et B = 0
    et j'utilise le TEmbeddedWEB

    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
     
     
    uses   
      OleCtrls, SHDocVw_EWB, EwbCore, EmbeddedWB,
      cxGraphics, ActiveX, ComObj, MSHTML;
     
    {Place la surbrillance sur le mot recherché }
    procedure TForm1.SearchAndHighlightText(aText: string);
    var
      tr: IHTMLTxtRange;
    begin
      if not EmbeddedWB1.Busy then
      begin
        tr := ((EmbeddedWB1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;
     
        while tr.findText(aText, 1, 0) do
        begin
          tr.pasteHTML('<span style="background-color: Lime; font-weight: bolder;">' + tr.htmlText + '</span>');
          tr.scrollIntoView(True);
        end;
      end;
    end;
     
    {Transorme le WebBrowser en TBitmap }
    procedure WebBrowserScreenShot(const wb: TEmbeddedWB);
    var
      viewObject: IViewObject;
     MyRect: TRect;
      bitmap: TBitmap;
      PixelSearch: TColor;
      j, i, k: integer;
      row: pRGBTripleArray;
      R, G, B: Byte;
      CouleurPixel: TColor;
    begin
      PixelSearch := ClLime; {ou soit R = 0; V = 255 ; B = 0 }
     
      if wb.Document <> nil then
      begin
        wb.Document.QueryInterface(IViewObject, viewObject);
        if Assigned(viewObject) then
        try
     
          bitmap := TBitmap.Create;
          bitmap.PixelFormat := pf24bit;
     
          try
            MyRect := Rect(0, 0, wb.Width, wb.Height);
     
            bitmap.Height := wb.Height;
            bitmap.Width := wb.Width;
     
            viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Application.Handle, bitmap.Canvas.Handle, @r, nil, nil, 0);
     
     /////////////// SCANLINE pour trouver un pixel de couleur Lime /////////////////
     
            with bitmap.Canvas do
            begin
              for x := 0 to (Bitmap.Width - 1) do
                for y := 0 to (Bitmap.Height - 1) do
                begin
     
                  CouleurPixel := Pixels[x, y];
     
                  R := getRValue(CouleurPixel);
                  G := getGValue(CouleurPixel);
                  B := getBValue(CouleurPixel);
     
                  if (R = 0) and (G = 255) and (B = 0) then
                    showmessage('bingo!');
                end;
            end;
     
    /////////////////////////////////////////////
     
          finally
            bitmap.Free;
          end;
        finally
          viewObject._Release;
        end;
      end;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      SearchAndHighlightText('MyWord');
      WebBrowserScreenShot(EmbeddedWB1); 
    end;

    le code se compile bien et je n'ai pas d'erreur d'exécution.
    il faut maintenant introduire la boucle des pixels avec scanline plus rapide que Pixels[x,y]..

    en attendant, j'ai toutefois lancé un premier test avec Pixels[x,y]
    mais il ne trouve pas la couleur Lime !

    peux-tu voir la toile que j'ai faite ?

    merci

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    bon, des erreurs de code, le EmbeddedWB qui ne marche pas..
    mais j'y suis presque !
    @+

  6. #6
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Salut Cantador,

    en fait ton bitmap restait désespérément vide à cause d'une petite erreur dans les paramètres de la fonction Draw:
    il faut mettre @MyRect et non @R

    et déclarer X et Y et voilà tout roule ...
    j'ai modifié le pour passer TWebBrowser mais ça ne change rien
    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
    {Transforme le WebBrowser en TBitmap }
    procedure WebBrowserScreenShot(const wb: TWebBrowser);
    var
      viewObject: IViewObject;
      MyRect: TRect;
      bitmap: TBitmap;
      PixelSearch: TColor;
      x, y: integer;   // <-- Ajouté
    begin
      PixelSearch := ClLime; {ou soit R = 0; V = 255 ; B = 0 }
     
      if wb.Document <> nil then
      begin
        wb.Document.QueryInterface(IViewObject, viewObject);
        if Assigned(viewObject) then
        try
     
          bitmap := TBitmap.Create;
          bitmap.PixelFormat := pf24bit;
     
          try
            MyRect := Rect(0, 0, wb.Width, wb.Height);
     
            bitmap.Height := wb.Height;
            bitmap.Width := wb.Width;
     
            viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Application.Handle, bitmap.Canvas.Handle, 
              @MyRect,  // <-- Modifié 
              nil, nil, 0);
     
     /////////////// SCANLINE pour trouver un pixel de couleur Lime /////////////////
     
            with bitmap.Canvas do
            begin
              for y := 0 to (Bitmap.Height - 1) do
                for x := 0 to (Bitmap.Width - 1) do
                  if PixelSearch = Pixels[X, Y] then
                  begin
                    showmessage('bingo!');
                    Exit;
                  end;
            end;
     
    /////////////////////////////////////////////
     
          finally
            Bitmap.SaveToFile('testBmp.bmp');
            bitmap.Free;
          end;
        finally
          viewObject._Release;
        end;
      end;
    end;
    Voilà, en espérant que ça t'aidera
    @++

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    ça m'a fait plaisir de te retrouver.

    oui, j'avais vu mon erreur et depuis, j'ai amélioré le code :
    le focus doit être placé sur le Browser et je place la souris
    au centre de la surbrillance sinon, je choppe d'autres liens !

    autre difficulté, j'ai du mettre en place 16 Timer afin de contrôler tous les pédalages les clics sur les différentes zones.
    mais maintenant, le programme fonctionne bien.
    l'ennui est qu'une fois lancé, la souris étant robotisée, on ne peut plus se servir du PC !
    et comme je prends quelques jours de congés, je vais pouvoir lancer la bête.

    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
     
    procedure WebBrowserScreenShot2(const wb: TWebbrowser);
    var
      viewObject: IViewObject;
      MyRect: TRect;
      bitmap: TBitmap;
      x, y, nc : integer;
      CouleurPixel: TColor;
      R, G, B: Byte;
    begin
      {couleur de recherche ClLime {ou soit R = 0; V = 255 ; B = 0 }
      nc := 0;
     
      if wb.Document <> nil then
      begin
        wb.Document.QueryInterface(IViewObject, viewObject);
        if Assigned(viewObject) then
        try
          bitmap := TBitmap.Create;
          Bitmap.PixelFormat := pf24bit;
     
          try
            MyRect := Rect(0, 0, wb.Width, wb.Height);
            bitmap.Height := wb.Height;
            bitmap.Width := wb.Width;
     
            Form1.WebBrowser1.SetFocus;  // le focus doit être sur le browser !
     
            viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Application.Handle, bitmap.Canvas.Handle, @MyRect, nil, nil, 0);
     
            with bitmap.Canvas do
            begin
     
              for x := 0 to (Bitmap.Width - 1) do
                for y := 0 to (Bitmap.Height - 1) do
                begin
                  CouleurPixel := Pixels[x, y];
                  R := getRValue(CouleurPixel);
                  G := getGValue(CouleurPixel);
                  B := getBValue(CouleurPixel);
     
                  if (R = 0) and (G = 255) and (B = 0) then // ClLime
                  begin
                    tabx[nc] := x;
                    taby[nc] := y;
                    Inc(nc);
                  end;
                end;
            end;
     
            Setlength(tabx, nc);
            Setlength(taby, nc);
     
            BIlot := Point(Trunc(Mean(tabx)), Trunc(Mean(taby))); // calcul du point au centre de la surbrillance
     
          finally
            bitmap.Free;
          end;
        finally
          viewObject._Release;
        end;
      end;
    end;
    il faudrait juste améliorer le code en remplaçant le Pixels[x, y] par ScanLine
    mais comme ça fonctionne bien et qu'il faut chaud..

    @bientôt Cirec

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    j'ai eu quelques soucis avec Le TEmbeddedWB notamment au niveau du placement de la surbrillance sur le mot.
    je n'ai rien compris..
    et donc, je suis repassé au TWebbrowser.

    @+

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/08/2007, 15h19
  2. executer une commande sur un serveur depuis une page web
    Par nico33410 dans le forum Général Conception Web
    Réponses: 12
    Dernier message: 21/04/2007, 19h02
  3. Action sur le serveur via une page web
    Par raphxyz dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 26/08/2006, 18h07
  4. [debutant] lister tout les mots d'une page web!
    Par kriskikout dans le forum Web
    Réponses: 20
    Dernier message: 31/05/2006, 22h47
  5. Comment Appuyer sur le bouton d'une page web...?
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/01/2005, 14h07

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