Modifier une page web dynamiquement

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Modifier une page web dynamiquement

Message par nico »

Voici un code qui permet de modifier une page web, car SetGadgetItemText(#Web,#PB_Web_HtmlCode,Texte) ne permet pas de le faire.

Code : Tout sélectionner

Procedure SetHtml(Browser.IWebBrowser2,Texte.s)
  Protected DocumentDispatch.IDispatch,Document2.IHTMLDocument2,Element.IHTMLElement
  Protected Busy.l,Ret=0
  
  If Browser
    If Browser\Get_Busy(@Busy) = #S_OK
      If Busy= #VARIANT_FALSE
        If Browser\get_Document(@DocumentDispatch.IDispatch)=#S_OK And DocumentDispatch
          If DocumentDispatch\QueryInterface(?IID_IHTMLDocument2,@Document2.IHTMLDocument2)=#S_OK And Document2
            If Document2\get_body(@Element.IHTMLElement)=#S_OK And Element
              If Element\put_innerHTML(Texte)=#S_OK
                Ret=1
              EndIf 
              Element\Release()
            EndIf
            Document2\Release()
          EndIf
          DocumentDispatch\Release()
        EndIf
      EndIf 
    Else
      MessageRequester ( "Info" , "Attendez que la page soit chargée" )
    EndIf
  EndIf
  ProcedureReturn Ret
EndProcedure 
        
Procedure.s GetHtml(Browser.IWebBrowser2)
  Protected DocumentDispatch.IDispatch,Document2.IHTMLDocument2,Element.IHTMLElement
  Protected Busy.l,*Bstr.i
  Protected Texte.s=""
  
  If Browser
    If Browser\Get_Busy(@Busy.l) = #S_OK
      If Busy= #VARIANT_FALSE
        If Browser\get_Document(@DocumentDispatch.IDispatch)=#S_OK And DocumentDispatch
          If DocumentDispatch\QueryInterface(?IID_IHTMLDocument2,@Document2.IHTMLDocument2)=#S_OK And Document2
            If Document2\get_body(@Element.IHTMLElement)=#S_OK And Element
              If Element\get_innerHTML(@*Bstr)=#S_OK And *Bstr
                Texte.s=PeekS(*Bstr,-1, #PB_Unicode)
                SysFreeString_(*Bstr)
              EndIf
              Element\Release()
            EndIf
            Document2\Release()
          EndIf
          DocumentDispatch\Release()
        EndIf
      EndIf 
    Else
      MessageRequester ( "Info" , "Attendez que la page soit chargée" )
    EndIf
  EndIf
  
  ProcedureReturn Texte
EndProcedure 
        
Enumeration
  #Window
  #Web
  #Button1
EndEnumeration

If OpenWindow(#Window,0,0,800,400,"Web",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  CreateGadgetList(WindowID(#Window))
  WebGadget(#Web,0,0,800,360,"")
  ButtonGadget(#Button1,10,370,100,20,"Modifier la Page")
  SetGadgetText(#Web,"http://www.purebasic.fr/french/")
  
  Browser.IWebBrowser2=GetWindowLong_(GadgetID(#Web),#GWL_USERDATA)
  
  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      Select EventGadget()
        Case #Button1
          Texte.s=GetHtml(Browser)
          Texte="<h1><center><font color='#FF0000'>Bienvenue sur le Forum de PureBasic</font></center></h1></BR>"+Texte
          SetHtml(Browser,Texte)
      EndSelect
    EndIf
  Until Event=#PB_Event_CloseWindow
EndIf


DataSection
  IID_IHTMLDocument2: ; {332C4425-26CB-11D0-B483-00C04FD90119}
  Data.l $332C4425
  Data.w $26CB,$11D0
  Data.b $B4,$83,$00,$C0,$4F,$D9,$01,$19
EndDataSection
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Modifier une page web dynamiquement

Message par Backup »

nico a écrit :vu que SetGadgetItemText(#Web,#PB_Web_HtmlCode,Texte) n'a pas l'air de fonctionner correctement.
Fred en dit quoi ? de ce "bug"
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Modifier une page web dynamiquement

Message par nico »

J'ai posté sur le Forum Anglais, et apparemment SetGadgetItemText(#Web,#PB_Web_HtmlCode,Texte) ne sert pas à modifier dynamiquement une page Web.

Si tu fais un simple GetGadgetItemText et SetGadgetItemText du texte que tu as récupéré, tu verras que tu perds tout les liens (images, style etc...)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Modifier une page web dynamiquement

Message par Backup »

nico a écrit :J'ai posté sur le Forum Anglais, et apparemment SetGadgetItemText(#Web,#PB_Web_HtmlCode,Texte) ne sert pas à modifier dynamiquement une page Web.
c'est bien dommage ...
Fred aurai peut etre pu faire en sorte que si ....

il suffirai de compiler ton code, et d'en faire une fonction nouvelle inclue dans le purebasic..

c'est ça que je ne comprends pas en fait ...

pourquoi Fred n'utilise pas les codes postés dans les forums , pour creer de nouvelles fonctions avec ? :roll:

parceque pas portable ?

alors je me pose une autre question

n'aurions nous pas mieux fait d'avoir un langage performant specifique a un OS
plutot que 3 versions qui finalement empechent peut etre l'évolution du langage ....

comment font les langages puissants Cross Compilable ?
(ha tiens.. une question de plus :) )
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Modifier une page web dynamiquement

Message par nico »

C'est pour ça que je trouve dommage entre autre que PureBasic soit multiplateforme, car il faut adapter les codes pour les autres plateformes.

Personnellement je ne peux pas écrire de code sans faire appel aux API, donc le mutiplateforme ne me sert à rien :roll:

Si il n'y avait qu'une version (Window), il y a bien longtemps par exemple qu'on pourrait charger, enregistrer du rtf, coller des images etc...

La version de window serait dix fois plus puissantes actuellement.

Mais c'est comme ça. :|
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Modifier une page web dynamiquement

Message par G-Rom »

#exclude <windows.h>

Faut bien pensé à ceux qui ne sont pas sous windows.
D'ailleurs , pour trollé un peu , mon frère à acheter un jeu hier , impossible à installer , l'installeur plantais lamentablement ...
obligé de jouer avec la bdr , entré des commandes obscur dans un pauvre shell , pour au final désinstallé l'installeur pour le réinstallé ! :mrgreen:
c'est comme patché des patchs , y a que sous windows que l'on voit ca... :mrgreen:
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Modifier une page web dynamiquement

Message par Ar-S »

pour troller aussi, faut dire que sous linux le nombre de jeux est tellement impressionnant ^^
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Modifier une page web dynamiquement

Message par G-Rom »

y a wine... playOnLinux , pis je fait pas de jeux , na ! quand je joue , je chourre le pc de ma femme :mrgreen:
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: Modifier une page web dynamiquement

Message par david »

bonjour à tous,
J'ai essayer de bidouiller ce code qui est super, mais je ne parviens pas à mes fins...
Je précise que je suis (très) débutant, merci de votre compréhension

Je voudrais au lancement du code que:
ma page se charge, soit modifiée, puis affichée automatiquement (afin qu'on ne voit pas son original puis la modification) et ce sans passer par le bouton (que j'utiliserais pour autre chose).
Le pb c'est que quand j'insère un delay pour lui laisser le temps de charger la page, il fait la modif sur une page vide et seulement après il affiche ma page non modifiée... le problème est de lui dire: tu fais ta modif quand ta page est chargée

J'ai un autre pb qui est que la page est rafraichie régulièrement et je ne sais pas comment lui dire de réappliquer la modification à chaque rafraichissement.
Même pb si je clic quelque part et que je passe de "www.mon-site" à "www.mon-site/documents", il faudrait qu'il réapplique également la modification.

J'essaie également de remplacer un mot qui est toujours le même. Je ne sais pas comment faire. Je pense qu'il faut scanner l'intégralité du html (j'ai trouvé des exemples sur le site), mais faire un rechercher/remplacer c'est un autre morceau

Bon ça fait beaucoup de choses...
Je reçois avec grand plaisir toute aide, information, piste de réflexion...., commentaire... me permettant d'avancer sur mes problématiques
Merci
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: Modifier une page web dynamiquement

Message par david »

j'ai trouvé la réponse à ma dernière problématique avec :

Code : Tout sélectionner

ReplaceString (Texte, valcherch1, valdest1 ,#PB_String_NoCase)
pour le reste je pensais faire touner un autre programme qui va voir si la page internet est ouverte et modifie a chaque fois qu'on clic
mais il ne se passe rien....

Code : Tout sélectionner

Repeat
;############################ voir si pg principal pas ouvert faire end  ##############################
  
  
  
  Delay(50)
  For i=0 To $FE
    Key=GetAsyncKeyState_(i)
    If Key=-32767 ; si une touche est pressée...
      
      If i=#VK_LBUTTON Or i=#VK_RBUTTON ;si un clic souris est pressé
        
        
                  Texte.s=GetHtml(Browser)
                  resultat.s= ReplaceString (Texte, valcherch1, valdest1 ,#PB_String_NoCase)
                  SetHtml(Browser,resultat)
        
        
        
      Else
        Debug i
      EndIf
    EndIf
  Next i
ForEver  
bon je continue mes recherches...
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: Modifier une page web dynamiquement

Message par david »

bon j'ai essayé d'appeler la modif toutes les secondes avec

Code : Tout sélectionner

CreateThread(@AlertThread(), 154)
mais ça ne marche pas car je perd surrement mes paramètres en route et je plante tout

j'ai essayé de simuler l'appuie du bouton

Code : Tout sélectionner

SetGadgetState(#Button1, 1)
mais ça ne marche pas

j'en suis là:

Code : Tout sélectionner

If OpenWindow(#Window,0,0,larg_fenetr,haut_fenetr,titre_app ,#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget  )
  
            
     
            
          
  WebGadget(#Web,0,0,larg_fenetr,haut_fenetr-bordure,"")
  ButtonGadget(#Button1,10,haut_fenetr-bordure,100,20,"Modifier la Page")
  SetGadgetText(#Web,"https://mon-site-a-moi.com")
    Browser.IWebBrowser2=GetWindowLong_(GadgetID(#Web),#GWL_USERDATA)
    
      
            
 
 
  ;boucle boutons 
  Repeat
    
               
    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      Select EventGadget()
        Case #Button1
          
        
            ;modif page
            Texte.s=GetHtml(Browser)
            resultat.s= ReplaceString (Texte, valcherch1, valdest1 ,#PB_String_NoCase)
            SetHtml(Browser,resultat)  
            
            If premierefois="o"
              MessageRequester("PREMIERE FOIS","bouton")
              CreateThread(@AlertThread(), 154)
              premierefois="n"
            EndIf
            
        
  
        EndSelect
        EndIf
              
        
        Until Event=#PB_Event_CloseWindow
      EndIf
      
      
      
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: Modifier une page web dynamiquement

Message par david »

l'idéal serait de MODIFIER la page à chaque clic

j'ai bien trouvé ça mais pour l'adapter vu mon niveau je ne suis pas arrivé

Code : Tout sélectionner

Procedure HookActionCallBack(nCode, wParam, lParam) 
  Select wParam
      Case #WM_RBUTTONDOWN
        Debug "Bouton droit de la souris enfoncé."
       
      Case #WM_RBUTTONUP
        Debug "Bouton droit de la souris relaché."
       
      Case #WM_LBUTTONDOWN
        Debug "Bouton gauche de la souris enfoncé."
   
      Case #WM_LBUTTONUP
        Debug "Bouton gauche de la souris relaché."
       
      Case #WM_MBUTTONDOWN
        Debug "Bouton central de la souris enfoncé."
       
      Case #WM_MBUTTONUP
        Debug "Bouton central de la souris relaché."
       
    EndSelect
   
  ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure

;Exécution du Hook
HookMouseHandle = SetWindowsHookEx_(#WH_MOUSE_LL,@HookActionCallBack(), GetModuleHandle_(0),0)

OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_Invisible)
StickyWindow(1, 1)

Repeat

Until WaitWindowEvent()=#PB_Event_CloseWindow

;On libére les Hooks à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookMouseHandle)
Répondre