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

API, COM et SDKs Delphi Discussion :

Récupérer texte de l'URL d'IE (pack Orange)


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut Récupérer texte de l'URL d'IE (pack Orange)
    Bonjour,

    Afin de tracer un historique des pages visitées par un User, je voudrais récupérer le contenu de la barre de nav de IE.
    J'ai trouvé un code sur le site Michel (phidels.com) que j'ai un peu modifié
    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i:integer;
      HandleWindow,HandleParent,HandleTmp: HWnd;
      Buffer : Array[0..255] of char;
      Explorer,ClientWork,Toolbar,ComboBox,ComboBoxChild,Edit:HWND;
      Mem:integer;
      Resultat:string;
    begin
      LstHandle.Clear;
      EnumWindows(@EnumWindowsProc,LongInt(LstHandle));
      for i:=0 to LstHandle.Count-1 do
        begin
          HandleWindow := StrToIntDEF(copy(LstHandle[i],1,pos('-',LstHandle[i])-1),-1);
          if HandleWindow <> -1 then
            begin
              HandleTmp:= HandleWindow;
              HandleParent:= GetWindow(HandleTmp,GW_OWNER);
              while HandleParent <> 0 do
                begin
                  HandleTmp:= HandleParent;
                  HandleParent:= GetWindow(HandleTmp,GW_OWNER);
                end;
              GetWindowText(HandleTmp,Buffer,255);
              if StrLen(Buffer) <> 0 then
                if pos('internet',lowercase(StrPas(Buffer))) > 0 then
                  begin
                    memo2.lines.Add(IntToStr(HandleWindow)+' parent: '+IntToStr(HandleTmp)+'-'+StrPas(Buffer));
                    //Cherche le Handle de la fenêtre de travail
                    ClientWork:=FindWindowEx(HandleTmp,0,'WorkerA',nil);
                    if ClientWork=0 then //Compatibilité XP / 98
                      ClientWork:=FindWindowEx(HandleTmp,0,'WorkerW',nil);
                    //Retrouve le Handle de la ToolBar
                    Toolbar:=FindWindowEx(ClientWork,0,'ReBarWindow32',nil);
                    //Cherche le Handle du ComboBox
                    ComboBox:=FindWindowEx(Toolbar,0,'ComboBoxEx32', nil);
                    ComboBoxChild:=FindWindowEx(ComboBox,0,'ComboBox',nil);
                    //Atteint l'Edit et envoie un message pour avoir le texte
                    Edit:=FindWindowEx(ComboBoxChild,0,'Edit',nil);
                    Mem:=SendMessage(Edit,WM_GETTEXTLENGTH,0,0)+1;
                    SetLength(Resultat,Mem);
                    //Envoi du message
                    SendMessage(Edit,WM_GETTEXT,Mem,Integer(@Resultat[1]));
                    memo2.lines.Add(Resultat);
                 end;
            end
          else
            memo2.lines.Add(LstHandle[i]+' valeur incorrecte ');
        end;
    end;
    Malheureusement ce code fonctionne très bien avec IE "normal" mais ne fonctionne pas avec le navigateur installé avec la LiveBox de wanadoo. Après debug je me suis aperçu que le nom de la classe du control contenant la barre de nav ne doit pas être le même ('ReBarWindow32').

    Je balaye avec cette liste de nom de classe
    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
    procedure LoadLstClassControlName(var LstClassControlName:TStringList);
    begin
      LstClassControlName.Clear;
      LstClassControlName.add('Button');
      LstClassControlName.add('ButtonListBox');
      LstClassControlName.add('Combobox');
      LstClassControlName.add('ComboLBox');
      LstClassControlName.add('ComboBoxEx32');
      LstClassControlName.add('Edit');
      LstClassControlName.add('Listbox');
      LstClassControlName.add('msctls_trackbar32');
      LstClassControlName.add('msctls_updown32');
      LstClassControlName.add('msctls_progress32');
      LstClassControlName.add('msctls_hotkey32');
      LstClassControlName.add('msctls_statusbar32');
      LstClassControlName.add('NativeFontCtl');
      LstClassControlName.add('ReBarWindow32');
      LstClassControlName.add('ScrollBar');
      LstClassControlName.add('Static');
      LstClassControlName.add('SysAnimate32');
      LstClassControlName.add('SysDateTimePick32');
      LstClassControlName.add('SysHeader32');
      LstClassControlName.add('SysLink');
      LstClassControlName.add('SysListView32');
      LstClassControlName.add('SysMonthCal32');
      LstClassControlName.add('SysTreeView32');
      LstClassControlName.add('SysTabControl32');
      LstClassControlName.add('SysIPAddress32');
      LstClassControlName.add('SysPager');
      LstClassControlName.add('ToolbarWindow32');
      LstClassControlName.add('tooltips_class32');
      LstClassControlName.add('WorkerA');
      LstClassControlName.add('WorkerW');
    end;
    Quelqu'un aurait-il une idée du nom des classes Control de la barre Livebox?
    ou une autre idée pour récupérer le texte ...

    Merci à tous

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ce code est assez casse gueule

    il suffit que la nouvelle version d'IE change sa présentation et plus rien ne marche

    il serait préférable de chercher une technique de Hook pour choper les requêtes là où elles sont mais je ne sais pas ni comment et ni si c'est possible.

    PS: moi je navigue sur Firefox
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    Ta méthode par les Hook est faisable mais compliquée, je m'explique:
    en créant dans une zone mémoire, un tampon recevant les messages de IE on récupère bien les URL mais une tonne d'autres messages... pour garder que les URL valides et pas les redirections de pub et autres conneries de ce genre c'est la folie...

    En fait j'ai trouvé une amélioration de ce code que je mettrais en ligne quand il sera terminé. Je passe par la hiérachie des fenêtres : on cherche la fenêtre principale d'IE (ou de firefox, ca marche aussi) on cherche les enfants jusqu'a ce que l'on trouve un Control de type Edit et lorsque l'on ne trouve plus d'enfant on se positionne sur GW_HWNDFIRST puis on regarde le GW_HWNDNEXT jusqu'au GW_HWNDLAST (code récursif).
    L'avantage, en plus, c'est que tant que tu gardes un IE ouvert tu n'as pas a refaire le taf pour son handle car il reste le même.

    Tiens, par la même occasion:
    je vais mettre ce code dans un service threaded. Hors, dans ma première version avec le Hook, quand je passais en mode service, le thread se lançait bien mais la communication avec la DLL de Hook ne se faisait plus. Une idée?

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    En son temps, j'avais fait une petite application pour piloter IE. Elle dépendait des clicks de souris mais tu pourras certainement en tirer quelques infos .

    Procédure et message non implémentés (au minimum jusqu'à D2007) nécessaires pour récupérer l'interface IHTMLDocument2;

    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
    type
      TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam; out pObject): HRESULT; stdcall;
     
    var
      DLL               :THandle;
      WM_HTML_GETOBJECT :integer;
      ObjectFromLresult :TObjectFromLresult;
     
    procedure LoadOleAccDLL;
    begin
      DLL := LoadLibrary('Oleacc.dll');
     
      if DLL <> 0 then
      begin
        @ObjectFromLresult := GetProcAddress(DLL, 'ObjectFromLresult');
        WM_HTML_GETOBJECT  := RegisterWindowMessage('WM_HTML_GETOBJECT');
      end;
    end;
    Récupération d'un Doc de type IHTMLDocument2 et d'un variable IE sous la forme d'un IWebBrowser2. A toi d'y passer le handle de fenêtre depuis ta boucle :

    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
    var
      IE  :IWebBrowser2 = nil;
      Doc :IHTMLDocument2 = nil;
     
    function GetIEFromHWND(WHandle: HWND): HRESULT;
    var
      lRes: Cardinal;
    begin
      if @ObjectFromLresult <> nil then
      try
        if SendMessageTimeOut(WHandle, WM_HTML_GETOBJECT, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes) <> 0 then
        begin
          Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, Doc);
          if Result = S_OK then
            (Doc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
        end
        else Result := S_FALSE;
      except
        Result := S_FALSE;
      end;
    end;
    Tu ne devrais plus avoir de problème à récupérer l'URL depuis Doc .

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    Merci AndNotor, je regarde...

Discussions similaires

  1. [PDE] Récupérer texte mis en surbrillance dans un éditeur
    Par simsky dans le forum Eclipse Platform
    Réponses: 20
    Dernier message: 10/07/2007, 12h03
  2. [Sécurité] Passage de texte dans une URL
    Par MiJack dans le forum Langage
    Réponses: 7
    Dernier message: 10/06/2006, 21h24
  3. Comment récupérer les icones des URL?
    Par Blo0d4x3 dans le forum Windows
    Réponses: 3
    Dernier message: 26/05/2006, 15h29
  4. Récupérer texte dans des variables
    Par Coussati dans le forum Langage
    Réponses: 8
    Dernier message: 12/11/2005, 18h26
  5. [Servlet] Méthode Get : récupérer données de l'url
    Par david71 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 01/02/2005, 11h52

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