Tips WebGadget

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

Tips WebGadget

Message par nico »

Afficher les options d'Internet:


Enumeration 1
#Find
#ViewSource
#Options
EndEnumeration

webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
If Webbrowser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IOleCommandTarget, @CmdTarget.IOleCommandTarget) = #S_OK
CmdTarget\Exec(?CGID_IWebBrowser, #Options , #OLECMDEXECOPT_PROMPTUSER , #Null , #Null )
CmdTarget\Release()
EndIf
DocumentDispatch\Release()
EndIf

DataSection
CGID_IWebBrowser:
Data.l $ED016940
Data.w $BD5B, $11CF
Data.b $BA, $4E, $00, $C0, $4F, $D7, $08, $16

IID_IOleCommandTarget:
Data.l $B722BCCB
Data.w $4E68, $101B
Data.b $A2, $BC, $00, $AA, $00, $40, $47, $70
EndDataSection




Faire une recherche sur la page:


Enumeration 1
#Find
#ViewSource
#Options
EndEnumeration

webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
If Webbrowser\Get_Busy(@Busy.l) = #S_OK
If Busy= #VARIANT_FALSE
If Webbrowser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IOleCommandTarget, @CmdTarget.IOleCommandTarget) = #S_OK
CmdTarget\Exec(?CGID_IWebBrowser, #Find , #OLECMDEXECOPT_PROMPTUSER , #Null , #Null )
CmdTarget\Release()
EndIf
DocumentDispatch\Release()
EndIf
Else
MessageRequester ( "Info" , "Attendez que la page soit chargée" )
EndIf
EndIf

DataSection
CGID_IWebBrowser:
Data.l $ED016940
Data.w $BD5B, $11CF
Data.b $BA, $4E, $00, $C0, $4F, $D7, $08, $16

IID_IOleCommandTarget:
Data.l $B722BCCB
Data.w $4E68, $101B
Data.b $A2, $BC, $00, $AA, $00, $40, $47, $70
EndDataSection
Dernière modification par nico le jeu. 13/mars/2008 21:33, modifié 2 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Il existe plusieurs façon de gérer le menu contextuel d'Internet, on peut utiliser les interfaces mais malheureusement c'est inefficace si la page contient un script pour afficher son propre menu ou l'interdire.

Celui que je vous propose passe par le Subclassing de la classe "Internet Explorer_Server"



Enumeration 0
   #OLECMDEXECOPT_DODEFAULT
   #OLECMDEXECOPT_PROMPTUSER
   #OLECMDEXECOPT_DONTPROMPTUSER
   #OLECMDEXECOPT_SHOWHELP
EndEnumeration

Enumeration 1
   #OLECMDID_OPEN
   #OLECMDID_NEW
   #OLECMDID_SAVE
   #OLECMDID_SAVEAS
   #OLECMDID_SAVECOPYAS
   #OLECMDID_PRINT
   #OLECMDID_PRINTPREVIEW
   #OLECMDID_PAGESETUP
   #OLECMDID_SPELL
   #OLECMDID_PROPERTIES
   #OLECMDID_CUT
   #OLECMDID_COPY
   #OLECMDID_PASTE
   #OLECMDID_PASTESPECIAL
   #OLECMDID_UNDO
   #OLECMDID_REDO
   #OLECMDID_SELECTALL
   #OLECMDID_CLEARSELECTION
   #OLECMDID_ZOOM
   #OLECMDID_GETZOOMRANGE
   #OLECMDID_UPDATECOMMANDS
   #OLECMDID_REFRESH
   #OLECMDID_STOP
   #OLECMDID_HIDETOOLBARS
   #OLECMDID_SETPROGRESSMAX
   #OLECMDID_SETPROGRESSPOS
   #OLECMDID_SETPROGRESSTEXT
   #OLECMDID_SETTITLE
   #OLECMDID_SETDOWNLOADSTATE
   #OLECMDID_STOPDOWNLOAD
EndEnumeration


#TPM_RETURNCMD =$100
#TPM_NONOTIFY =$80

;Window
Enumeration
   #Main
EndEnumeration

;Gadget
Enumeration
   #Web
EndEnumeration

;Popup
Enumeration
   #Popup
   #PureBasic
EndEnumeration

Structure CURSORINFO
  cbSize.l
  flags.l
  hCursor.l
  ptScreenPos.POINT
EndStructure
 
Procedure EnumFunc(hchild.l,lParam.l)
  Protected class$
  class$= Space (30)
   GetClassName_ (hchild,@class$,29)
   Debug class$
   If class$= "Internet Explorer_Server"
     PokeL (lParam,hchild)
     ProcedureReturn 0
   EndIf
   ProcedureReturn 1
EndProcedure

Procedure NouvelleProc( Hwnd, msg, wParam, lParam)
  Protected OriginProc.l,id.l,pci.CURSORINFO,Point.POINT
   ;Ici on récupère l'adresse d'origine de la procédure grâce à la
   ;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre
   ;voir la fonction SetProp.
  OriginProc.l= GetProp_ (hWnd, "OriginProc" )
  
   GetCursorPos_ (@Point.POINT)
  
   Select msg
     Case #WM_RBUTTONUP
      pci\cbsize= SizeOf (CURSORINFO)
       GetCursorInfo_ (@pci)
       ; Je détecte si je suis dans une zone d"édition
       If pci\hCursor=65555
         GetCursorPos_ (@Point.POINT)
        id= TrackPopupMenu_ ( MenuID (0), #TPM_RETURNCMD|#TPM_NONOTIFY|#TPM_LEFTBUTTON | #TPM_RIGHTBUTTON | #TPM_LEFTALIGN , Point \x, Point \y, #Null , WindowID ( #Main ), #Null )
         If id
           ;J'envoie une commande de menu à traiter dans la bouclr d'évènement
           ;On peut aussi traiter directement la commande, c'est au choix
           PostMessage_ ( WindowID ( #Main ), #WM_COMMAND ,id,0)
           ProcedureReturn 0
         EndIf
       EndIf
      
     Case #WM_RBUTTONDBLCLK
       ProcedureReturn 0
      
     Case #WM_RBUTTONDOWN
       ; j'envoie un sendmessage pour donner le focus à l'input pour permettre le WM_PASTE
       ; sans avoir à faire un click gauche juste avant!
       SendMessage_ (Hwnd, #WM_LBUTTONDOWN ,wParam, lParam)
       SendMessage_ (Hwnd, #WM_LBUTTONUP ,wParam, lParam)
      
      
     Case #WM_NCDESTROY
       RemoveProp_ (Hwnd, "OriginProc" )
       SetWindowLong_ (Hwnd, #GWL_WNDPROC , OriginProc)
   EndSelect
   ;On renvoie tous les autres évènements à la procédure d'origine.
   ProcedureReturn CallWindowProc_ (OriginProc,hWnd,msg,wParam,lParam)
EndProcedure

If OpenWindow ( #Main ,0,0,600,300, "WebGadget" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
   CreateGadgetList ( WindowID ( #Main ))
   WebGadget ( #Web ,10,10,580,280, "http://www.purebasic.fr/french/login.php" )
  
   If CreatePopupMenu ( #Popup )
     MenuItem ( #PureBasic , "Pure Basic" )
   EndIf
  
   ; Il faut subclasser la classe Internet_Server et non le Gadget lui même
   EnumChildWindows_ ( GadgetID ( #Web ),@EnumFunc(),@IExplorer_Server)
   If IExplorer_Server
    OriginProc = SetWindowLong_ (IExplorer_Server, #GWL_WNDPROC , @NouvelleProc())
     SetProp_ (IExplorer_Server, "OriginProc" , OriginProc)
   EndIf
  
  webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
  
   Repeat
    event= WaitWindowEvent ()
     ;ViewEvent(event2)
     Select event
       Case #PB_Event_Menu
         Select EventMenu ()
           Case #PureBasic
             SetClipboardText ( "PureBasic" )
            webBrowser\ExecWB( #OLECMDID_PASTE , #OLECMDEXECOPT_DONTPROMPTUSER , 0, 0)
         EndSelect
       Case #WM_CLOSE
        Quit=1
     EndSelect
   Until Quit = 1
EndIf
End
Dernière modification par nico le sam. 08/mars/2008 23:54, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Voici la méthode en utilisant l'interface IDocHostUIHandler, cette méthode ne fonctionne pas si la page Web interdit le click droit où crée son propre menu, d'où l'intérêt du code précédent.

Code non optimisé, ne fonctionne pas sur les sites avec Frames.


Code mis à jour, permet d'afficher les contrôles avec les thèmes.
Voir la procédure modifiée:GetHostInfo

Enumeration 0
#OLECMDEXECOPT_DODEFAULT
#OLECMDEXECOPT_PROMPTUSER
#OLECMDEXECOPT_DONTPROMPTUSER
#OLECMDEXECOPT_SHOWHELP
EndEnumeration

Enumeration 1
#OLECMDID_OPEN
#OLECMDID_NEW
#OLECMDID_SAVE
#OLECMDID_SAVEAS
#OLECMDID_SAVECOPYAS
#OLECMDID_PRINT
#OLECMDID_PRINTPREVIEW
#OLECMDID_PAGESETUP
#OLECMDID_SPELL
#OLECMDID_PROPERTIES
#OLECMDID_CUT
#OLECMDID_COPY
#OLECMDID_PASTE
#OLECMDID_PASTESPECIAL
#OLECMDID_UNDO
#OLECMDID_REDO
#OLECMDID_SELECTALL
#OLECMDID_CLEARSELECTION
#OLECMDID_ZOOM
#OLECMDID_GETZOOMRANGE
#OLECMDID_UPDATECOMMANDS
#OLECMDID_REFRESH
#OLECMDID_STOP
#OLECMDID_HIDETOOLBARS
#OLECMDID_SETPROGRESSMAX
#OLECMDID_SETPROGRESSPOS
#OLECMDID_SETPROGRESSTEXT
#OLECMDID_SETTITLE
#OLECMDID_SETDOWNLOADSTATE
#OLECMDID_STOPDOWNLOAD
EndEnumeration


#TPM_RETURNCMD =$100
#TPM_NONOTIFY =$80

#DOCHOSTUIFLAG_THEME = $40000

Structure DOCHOSTUIINFO
cbSize.l
dwFlags.l
dwDoubleClick.l
*pchHostCss.l
*pchHostNS.l
EndStructure

;Window
Enumeration
#Main
EndEnumeration

;Gadget
Enumeration
#Web
EndEnumeration

;Popup
Enumeration
#Popup
#PureBasic
EndEnumeration

Structure IDocHost
*IDocHostUIHandler.IDocHostUIHandler
ObjectCount.l
EndStructure

Global NewList IDocHost.IDocHost()

Procedure AddRef(*THIS.IDocHost)
*THIS\ObjectCount + 1
ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure QueryInterface(*THIS.IDocHost, *iid.GUID, *Object.LONG)
If CompareMemory (*iid, ?IID_IUnknown, SizeOf (GUID)) Or CompareMemory (*iid, ?IID_IDocHostUIHandler, SizeOf (GUID))
*Object\l = *THIS
AddRef(*THIS.IDocHost)
ProcedureReturn #S_OK
Else
*Object\l = 0
ProcedureReturn #E_NOINTERFACE
EndIf
EndProcedure

Procedure.l Release(*THIS.IDocHost)
*THIS\ObjectCount - 1
ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure ShowContextMenu(*THIS.IDocHost, dwID.l, *ppt.POINT, *pcmdtReserved.IUnknown, *pdispReserved.IDispatch)
Protected bstr.l,iSelection.l,pElem.IHTMLElement,parent.IHTMLElement

Select dwID
Case 0
Debug "CONTEXT_MENU_DEFAULT"

Case 1
Debug "CONTEXT_MENU_IMAGE"

Case 2
Debug "CONTEXT_MENU_CONTROL"
;Pour avoir plus de renseignement sur l'objet
If *pdispReserved\QueryInterface(?IID_IHTMLElement, @pElem.IHTMLElement)= #S_OK
If pElem

pElem\get_tagName(@bstr)
If bstr
Debug PeekS (bstr, 200, #PB_Unicode )
EndIf

pElem\get_outerHTML(@bstr)
If bstr
Debug PeekS (bstr, 200, #PB_Unicode )
EndIf

pElem\get_parentElement(@parent.IHTMLElement)
parent\get_outerHTML(@bstr)
parent\Release()
If bstr
Debug PeekS (bstr, 200, #PB_Unicode )
EndIf

pElem\Release()
Debug SysFreeString_ (@bstr)
EndIf
EndIf
iSelection = TrackPopupMenu_ ( MenuID ( #Popup ), #TPM_LEFTALIGN | #TPM_RIGHTBUTTON | #TPM_RETURNCMD ,*ppt\x,*ppt\y,0, GadgetID ( #Web ), #Null )
If iSelection <> 0
PostMessage_ ( WindowID ( #Main ), #WM_COMMAND , iSelection, #Null )
ProcedureReturn #False ;0 pour interdire le menu par défaut
EndIf


Case 3
Debug "CONTEXT_MENU_TABLE"

Case 4
Debug "CONTEXT_MENU_TEXTSELECT"

Case 5
Debug "CONTEXT_MENU_ANCHOR"

Case 6
Debug "CONTEXT_MENU_UNKNOWN"
EndSelect

ProcedureReturn #True ;1 pour autoriser le menu par défaut
EndProcedure

Procedure GetHostInfo(*THIS.IDocHost, *pInfo.DOCHOSTUIINFO)
*pInfo\dwFlags = *pInfo\dwFlags | #DOCHOSTUIFLAG_THEME
ProcedureReturn #S_OK
EndProcedure

Procedure ShowUI(*THIS.IDocHost, dwID.l, *pActiveObject.l, *pCommandTarget.l, *pFrame.l, *pDoc.l)
ProcedureReturn #S_OK
EndProcedure

Procedure HideUI(*THIS.IDocHost)
ProcedureReturn #S_OK
EndProcedure

Procedure UpdateUI(*THIS.IDocHost)
ProcedureReturn #S_OK
EndProcedure

Procedure EnableModeless(*THIS.IDocHost, fEnable.l)
ProcedureReturn #S_OK
EndProcedure

Procedure OnDocWindowActivate(*THIS.IDocHost, fActivate.l)
ProcedureReturn #S_OK
EndProcedure

Procedure OnFrameWindowActivate(*THIS.IDocHost, fActivate.l)
ProcedureReturn #S_OK
EndProcedure

Procedure ResizeBorder(*THIS.IDocHost, *prcBorder.l, *pUIWindow.l, fFrameWindow.l)
ProcedureReturn #S_OK
EndProcedure

Procedure TranslateAccelerator(*THIS.IDocHost, *lpMsg.MSG, *pguidCmdGroup.GUID, nCmdID.l)
ProcedureReturn #S_OK
EndProcedure

Procedure GetOptionKeyPath(*THIS.IDocHost, *pchKey.l, dw.l)
ProcedureReturn #S_OK
EndProcedure

Procedure GetDropTarget(*THIS.IDocHost, *pDropTarget.l, *ppDropTarget.l)
*ppDropTarget= #Null
ProcedureReturn #E_NOTIMPL
EndProcedure

Procedure GetExternal(*THIS.IDocHost, *ppDispatch.LONG)
*ppDispatch\l = *THIS
ProcedureReturn #S_OK
EndProcedure

Procedure TranslateUrl(*THIS.IDocHost, dwTranslate.l, *pchURLIn.l, *ppchURLOut.l)
ProcedureReturn #S_FALSE
EndProcedure

Procedure FilterDataObject(*THIS.IDocHost, *pDO.IDataObject, *ppDORet.IDataObject)
*ppDORet = #Null
ProcedureReturn #S_FALSE
EndProcedure

If OpenWindow ( #Main ,0,0,600,300, "WebGadget" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
CreateGadgetList ( WindowID ( #Main ))
WebGadget ( #Web ,10,10,580,280, "http://www.google.fr/" )

If CreatePopupMenu ( #Popup )
MenuItem ( #PureBasic , "Pure Basic" )
EndIf

AddElement (IDocHost())
IDocHost()\IDocHostUIHandler=?IDocHostUIHandler

webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
If webBrowser\get_Document(@pDisp.IDispatch)= #S_OK
If pDisp\QueryInterface(?IID_ICustomDoc, @pDoc.ICustomDoc)= #S_OK
pdoc\SetUIHandler(@IDocHost()\IDocHostUIHandler)
pDoc\Release()
EndIf
pDisp\Release()
EndIf

Repeat
event= WaitWindowEvent ()
;ViewEvent(event2)
Select event
Case #PB_Event_Menu
Select EventMenu ()
Case #PureBasic
SetClipboardText ( "PureBasic" )
webBrowser\ExecWB( #OLECMDID_PASTE , #OLECMDEXECOPT_DONTPROMPTUSER , 0, 0)
EndSelect
Case #WM_CLOSE
Quit=1
EndSelect
Until Quit = 1
EndIf


DataSection
IDocHostUIHandler:
Data.l @QueryInterface()
Data.l @AddRef()
Data.l @Release()
Data.l @ShowContextMenu()
Data.l @GetHostInfo()
Data.l @ShowUI()
Data.l @HideUI()
Data.l @UpdateUI()
Data.l @EnableModeless()
Data.l @OnDocWindowActivate()
Data.l @OnFrameWindowActivate()
Data.l @ResizeBorder()
Data.l @TranslateAccelerator()
Data.l @GetOptionKeyPath()
Data.l @GetDropTarget()
Data.l @GetExternal()
Data.l @TranslateUrl()
Data.l @FilterDataObject()

IID_IDocHostUIHandler:
Data.l $BD3F23C0
Data.w $D43E, $11CF
Data.b $89, $3B, $00, $AA, $00, $BD, $CE, $1A

IID_ICustomDoc:
Data.l $3050F3F0
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

IID_IHTMLElement:
Data.l $3050F1FF
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

IID_IUnknown:
Data.l $00000000
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
EndDataSection
Dernière modification par nico le ven. 09/mai/2008 17:00, modifié 4 fois.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Merci pour ce joli code :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Un code qui met en place DIID_HTMLElementEvents2, pour recevoir des évents souris et clavier sur la page en cours.
Ce code est juste une démonstration, il n'est pas complet, il ne fonctionnera pas sur des pages web qui utilisent des Frames.

Avant d'exécuter ce code, remplacer Mon Login et Mon Mot de Passe dans la procédure OnMouseDown(..) par les votres, car ce code lance la connexion à ce Forum, cliquer sur les champs à remplir, et le texte sera écrit automatiquement.

Je crois qu'on peut faire beaucoup plus simple en faisant appel à la commande ElementFromPoint de l'interface IHtmlElement en subclassant la fenêtre Internet Explorer_Server.

Code : Tout sélectionner


; Les articles ci-dessous qui m'ont permis de rédiger ce code:
; MSDN:
; http://msdn2.microsoft.com/en-us/library/bb508508(VS.85).aspx
; CodeGuru:
; http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4391/


#DISPID_CLICK                    =-600 ;Cet event est reçu après l'event #DISPID_MOUSEUP
#DISPID_DBLCLICK                 =-601 ;Cet event est reçu après l'event #DISPID_MOUSEDOWN, #DISPID_MOUSEUP et #DISPID_CLICK
#DISPID_KEYDOWN                  =-602 ;on ne reçoit cet évènement que si on met en place une instance de IID_IOleInPlaceActiveObject
#DISPID_KEYPRESS                 =-603
#DISPID_KEYUP                    =-604 ;on ne reçoit cet event que si on met en place une instance de IID_IOleInPlaceActiveObject
#DISPID_MOUSEDOWN                =-605
#DISPID_MOUSEMOVE                =-606
#DISPID_MOUSEUP                  =-607
#DISPID_ERROREVENT               =-608
#DISPID_READYSTATECHANGE         =-609
; Il y a d'autres évènements, se reporter à la Doc MSDN


;//
;// Dispatch IDS For IExplorer Dispatch Events.
;//
#DISPID_BEFORENAVIGATE=     100   ;// this is sent before navigation To give a chance To abort
#DISPID_NAVIGATECOMPLETE=   101   ;// in async, this is sent when we have enough To show
#DISPID_STATUSTEXTCHANGE=   102
#DISPID_QUIT=               103
#DISPID_DOWNLOADCOMPLETE=   104
#DISPID_COMMANDSTATECHANGE= 105
#DISPID_DOWNLOADBEGIN=      106
#DISPID_NEWWINDOW=          107   ;// sent when a new window should be created
#DISPID_PROGRESSCHANGE=     108   ;// sent when download progress is updated
#DISPID_WINDOWMOVE=         109   ;// sent when main window has been moved
#DISPID_WINDOWRESIZE=       110   ;// sent when main window has been sized
#DISPID_WINDOWACTIVATE=     111   ;// sent when main window has been activated
#DISPID_PROPERTYCHANGE=     112   ;// sent when the PutProperty method is called
#DISPID_TITLECHANGE=        113   ;// sent when the document title changes
#DISPID_TITLEICONCHANGE=    114   ;// sent when the top level window icon may have changed.

#DISPID_FRAMEBEFORENAVIGATE=    200
#DISPID_FRAMENAVIGATECOMPLETE=  201
#DISPID_FRAMENEWWINDOW=         204

#DISPID_PRINTTEMPLATEINSTANTIATION= 225
#DISPID_PRINTTEMPLATETEARDOWN=      226

#DISPID_BEFORENAVIGATE2=      250   ;// hyperlink clicked on
#DISPID_NEWWINDOW2=           251
#DISPID_NAVIGATECOMPLETE2=    252   ;// UIActivate new document
#DISPID_ONQUIT=               253
#DISPID_ONVISIBLE=            254   ;// sent when the window goes visible/hidden
#DISPID_ONTOOLBAR=            255   ;// sent when the toolbar should be shown/hidden
#DISPID_ONMENUBAR=            256   ;// sent when the menubar should be shown/hidden
#DISPID_ONSTATUSBAR=          257   ;// sent when the statusbar should be shown/hidden
#DISPID_ONFULLSCREEN=         258   ;// sent when kiosk mode should be on/off
#DISPID_DOCUMENTCOMPLETE=     259   ;// new document goes ReadyState_Complete
#DISPID_ONTHEATERMODE=        260   ;// sent when theater mode should be on/off
#DISPID_ONADDRESSBAR=         261   ;// sent when the address bar should be shown/hidden
#DISPID_WINDOWSETRESIZABLE=   262   ;// sent To set the style of the host window frame
#DISPID_WINDOWCLOSING=        263   ;// sent before script window.close closes the window
#DISPID_WINDOWSETLEFT=        264   ;// sent when the put_left method is called on the WebOC
#DISPID_WINDOWSETTOP=         265   ;// sent when the put_top method is called on the WebOC
#DISPID_WINDOWSETWIDTH=       266   ;// sent when the put_width method is called on the WebOC
#DISPID_WINDOWSETHEIGHT=      267   ;// sent when the put_height method is called on the WebOC
#DISPID_CLIENTTOHOSTWINDOW=   268   ;// sent during window.open To request conversion of dimensions
#DISPID_SETSECURELOCKICON=    269   ;// sent To suggest the appropriate security icon To show
#DISPID_FILEDOWNLOAD=         270   ;// Fired To indicate the File Download dialog is opening
#DISPID_NAVIGATEERROR=        271   ;// Fired To indicate the a binding error has occured
#DISPID_PRIVACYIMPACTEDSTATECHANGE=   272  ;// Fired when the user's browsing experience is impacted
#DISPID_NEWWINDOW3=           273


Structure DispatchFunctions
    QueryInterface.l
    AddRef.l
    Release.l
    GetTypeInfoCount.l
    GetTypeInfo.l
    GetIDsOfNames.l
    Invoke.l
EndStructure

Structure DispatchObject
    *IDispatch.IDispatch
    ObjectCount.l
    Event.s
EndStructure

Structure VARIANT_SPLIT
    StructureUnion
    Variant.VARIANT
    Split.l[4]
    EndStructureUnion
EndStructure

Interface IHTMLElementCollection_FIXED
    QueryInterface(a,b)
    AddRef()
    Release()
    GetTypeInfoCount(a)
    GetTypeInfo(a,b,c)
    GetIDsOfNames(a,b,c,d,e)
    Invoke(a,b,c,d,e,f,g,h)
    toString(a)
    put_length(a)
    get_length(a)
    get__newEnum(a)
    item(a1,a2,a3,a4,b1,b2,b3,b4,c)
    tags(a1,a2,a3,a4,b)
EndInterface

Global NewList dispatchObject.DispatchObject(),webBrowser.IWebBrowser2

Procedure ConnectEvents(*pElem.IHTMLElement)
    Protected *pCPC.IConnectionPointContainer = #Null
    Protected *pCP.IConnectionPoint = #Null
    Protected dwCookie.l,*bstr.l,TagName.s
   
    *bstr.l = SysAllocString_(Space((20*2)+2))
    If *bstr
        If *pElem\get_tagName(@*bstr)=#S_OK
            If *bstr
                TagName.s=PeekS(*bstr, 20,#PB_Unicode)
                If  TagName="HTML"                   
                    ;// Check that this is a connectable object.
                    If *pElem\QueryInterface(?IID_IConnectionPointContainer, @*pCPC)=#S_OK
                        If *pCPC
                            ;// Find the connection point.
                            If *pCPC\FindConnectionPoint(?DIID_HTMLElementEvents2, @*pCP)=#S_OK
                                If *pCP
                                    ;// Advise the connection point.
                                    ;// pUnk is the IUnknown Interface pointer For your event sink
                                    AddElement(DispatchObject())
                                    DispatchObject()\IDispatch = ?dispatchFunctions
                                    DispatchObject()\Event="DIID_HTMLElementEvents2"
                                    If *pCP\Advise(@DispatchObject(), @dwCookie)=#S_OK
                                        ;Debug ";// Successfully advised"
                                        ret=1
                                    Else
                                        DeleteElement(DispatchObject())
                                    EndIf
                                    *pCP\Release()   
                                EndIf
                            EndIf
                            *pCPC\Release() 
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
        SysFreeString_(@*bstr)
    EndIf
    ProcedureReturn ret
EndProcedure

Procedure ProcessElementCollection(*pElemColl.IHTMLElementCollection_FIXED)
    Protected *pElemDisp.IDispatch = #Null
    Protected *pElem.IHTMLElement = #Null
    Protected long.l=0,varIndex.VARIANT_SPLIT
   
    varIndex.VARIANT_SPLIT\Variant\vt = #VT_I4
   
    *pElemColl\get_length(@long.l)
   
    For a=0 To long-1
        varIndex\Variant\lVal = a
        If *pElemColl\item(varIndex\split[0], varIndex\split[1], varIndex\split[2], varIndex\split[3], varIndex\split[0], varIndex\split[1], varIndex\split[2], varIndex\split[3], @*pElemDisp.IDispatch)=#S_OK
            If *pElemDisp
                If *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElem.IHTMLElement)=#S_OK
                    If *pElem
                        ;// Obtained element With ID of "myID".
                        If ConnectEvents(*pElem)
                            Break 
                        EndIf
                        *pElem\Release()
                    EndIf
                EndIf
                *pElemDisp\Release()   
            EndIf
        EndIf
    Next a
EndProcedure

Procedure ProcessDocument(*pDoc.IHTMLDocument2)
    Protected *pElemColl.IHTMLElementCollection_Fixed = #Null
   
    If *pDoc\get_all(@*pElemColl)=#S_OK
        If *pElemColl
            ;// Obtained element collection.
            ProcessElementCollection(*pElemColl)
            *pElemColl\Release()
        EndIf
    EndIf
EndProcedure

Procedure BeforeNavigate2(*pDisp.Idispatch, *Url.Variant, *Flags.Variant, *TargetFrameName.Variant, *PostData.Variant, *Headers.Variant, *Cancel.long)

EndProcedure

Procedure DocumentComplete(*pDisp.IDispatch, *Url.VARIANT)
    Debug "----------------------------------------------"
    Debug "DocumentComplete"
    Debug PeekL(*Url\bstrVal-4)
    Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
   
    Protected *pUnkBrowser.IUnknown = #Null
    Protected *pUnkDisp.IUnknown = #Null
    Protected *pDocDisp.IDispatch = #Null
    Protected *pDoc.IHTMLDocument2 = #Null
   
    ;// Is this the DocumentComplete event For the top frame window?
    ;// Check COM identity: compare IUnknown Interface pointers.
    If webBrowser\QueryInterface(?IID_IUnknown,@*pUnkBrowser)= #Null
        If *pUnkBrowser
            If *pDisp\QueryInterface(?IID_IUnknown, @*pUnkDisp)= #Null
                If *pUnkDisp
                    If (*pUnkBrowser = *pUnkDisp)
                        ;// This is the DocumentComplete event For the top frame.
                        ;// This page is loaded, so we can access the DHTML Object Model.
                        If webBrowser\get_Document(@*pDocDisp)= #Null
                            If *pDocDisp
                                ;// Obtained the document object.
                                If *pDocDisp\QueryInterface(?IID_IHTMLDocument2, @*pDoc)= #Null
                                    If *pDoc
                                        ;// Obtained the IHTMLDocument2 Interface For the document object
                                        ProcessDocument(*pDoc)
                                    EndIf
                                EndIf
                                *pDocDisp\Release()
                            EndIf
                        EndIf
                    EndIf
                    *pUnkDisp\Release()
                EndIf
            EndIf
            *pUnkBrowser\Release()
        EndIf
    EndIf
EndProcedure

Procedure NavigateComplete2(*pDisp.IDispatch, *Url.VARIANT)
EndProcedure

Procedure NavigateError(*pDisp.IDispatch, *Url.VARIANT, *TargetFrameName.VARIANT, *StatusCode.VARIANT, *Cancel.Long)

EndProcedure

Procedure NewWindow2(*ppDisp.Long, *Cancel.Long)

EndProcedure

Procedure ProgressChange(nProgress.l, nProgressMax.l)
    If nProgressMax>0
        Progress=nProgress*100/nProgressMax
        SetGadgetState(2, Progress)
    Else
        SetGadgetState(2, 0)
    EndIf
EndProcedure

Procedure StatusTextChange(*sText.l)
    Protected Texte.s
    Texte.s= PeekS(*sText,-1,#PB_Unicode)
    StatusBarText(0, 0, Texte)
EndProcedure

Procedure TitleChange(*sText.l)
    Protected Texte.s
    Texte=PeekS(*sText,-1,#PB_Unicode)
    element=GetGadgetState(0)
    SetGadgetItemText(0, element, Texte, 0)
EndProcedure

Procedure.l AddRef(*THIS.DispatchObject)
    *THIS\ObjectCount + 1
    ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.Long)
   
    If CompareMemory(*iid,?DIID_HTMLElementEvents2,16)Or CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID))
        *Object\l = *THIS
        *THIS2.IDispatch=*THIS.DispatchObject
        *THIS2\AddRef()
        ProcedureReturn #S_OK
    EndIf
   
    If CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
        *Object\l = *THIS
        *THIS2.IDispatch=*THIS.DispatchObject
        *THIS2\AddRef()
        ProcedureReturn #S_OK
    EndIf
   
    *Object\l = 0
    ProcedureReturn #E_NOINTERFACE
EndProcedure

Procedure.l Release(*THIS.DispatchObject)
    *THIS\ObjectCount - 1
    ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure GetTypeInfoCount(*THIS.DispatchObject, pctinfo)
    ProcedureReturn #E_NOTIMPL
EndProcedure

Procedure GetTypeInfo(*THIS.DispatchObject, iTInfo, lcid, ppTInfo )
    ProcedureReturn #E_NOTIMPL
EndProcedure

Procedure GetIDsOfNames(*THIS.DispatchObject, riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure

Procedure OnMouseDown(*pElem.IHtmlElement)
    Protected lFlags.l,*bstr.l,AttributeValue.VARIANT,Propriete.s

    If *pElem
        lFlags.l=1
        If *pElem\getAttribute("name",lFlags,@AttributeValue)=#S_OK
            If AttributeValue\vt=#VT_BSTR
                If AttributeValue\bstrVal
                    Propriete=PeekS(AttributeValue\bstrVal,-1,#PB_Unicode)
                    SysFreeString_(@AttributeValue\bstrVal)
                    If Propriete="username"
                        *bstr.l = SysAllocString_(Space((200*2)+2))
                        If *bstr
                            PokeS(*bstr,"Mon Login",-1,#PB_Unicode)
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute("value",@AttributeValue,lFlags)
                            SysFreeString_(@*bstr)
                        EndIf
                    ElseIf Propriete="password"
                        *bstr.l = SysAllocString_(Space((200*2)+2))
                        If *bstr   
                            PokeS(*bstr,"Mon Mot de Passe",-1,#PB_Unicode)
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute("value",@AttributeValue,lFlags)
                            SysFreeString_(@*bstr)
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf
EndProcedure


Procedure Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, *pVarResult.VARIANT, *pExcepInfo, *puArgErr)
    Protected *params1.VARIANT,*params2.VARIANT,*params3.VARIANT
    Protected *params4.VARIANT,*params5.VARIANT,*params6.VARIANT,*params7.VARIANT
    Protected *pEvtObj.IHTMLEventObj=#Null
    Protected *pElem.IHTMLElement=#Null
    Protected *pDispElem.IDispatch=#Null
    Protected Button.l,keyCode.l,ctrlKey.l,altKey.l
   
    Select *THIS\Event
        Case "DIID_HTMLElementEvents2"
            ; Debug "dispIdMember= "+Str(dispIdMember)
            ; Normalement, par rapport au code source de référence, je devrais travailler avec la variable *pVarResult
            ; pour récupérer un pointeur sur IDispatch mais ça ne marche pas, alors j'ai essayé
            ; avec *pDispParams\rgvarg et cela semble fonctionner
            *params1.VARIANT=*pDispParams\rgvarg
            *pDispElem.IDispatch = *params1\pdispVal
            If *pDispElem
                If *pDispElem\QueryInterface(?IID_IHTMLEventObj, @*pEvtObj)=#S_OK
                    If *pEvtObj
                        If *pEvtObj\Get_Button(@Button)=#S_OK
                            If *pEvtObj\get_keyCode(@keyCode)=#S_OK
                                If *pEvtObj\get_srcElement(@*pElem.IHTMLElement)=#S_OK
                                    If *pElem
                                        Select dispIdMember
                                            Case #DISPID_KEYPRESS
                                                If *pEvtObj\get_ctrlKey(@ctrlKey)=#S_OK
                                                    If ctrlKey
                                                        Debug "ctrlKey Pressed"
                                                    EndIf
                                                EndIf
                                                If *pEvtObj\get_altKey(@altKey)=#S_OK
                                                    If altKey
                                                        Debug "altKey Pressed"
                                                    EndIf
                                                EndIf           
                                                Debug "keyCode= "+Chr(keyCode)
                                                         
                                            Case #DISPID_KEYDOWN
                                                Debug "KEYDOWN"
                                               
                                            Case #DISPID_KEYUP
                                                Debug "KEYDUP"
                                               
                                            Case #DISPID_MOUSEMOVE
                                                Debug "MOUSEMOVE"
                                               
                                            Case #DISPID_MOUSEDOWN
                                                Select Button
                                                    Case 0   ;Default. No button is pressed.
                                                        Debug "DOWN> Left button is pressed"
                                                    ;---------------------------------------------   
                                                    Case 1   ;Left button is pressed.
                                                        Debug "DOWN> Left button is pressed"       
                                                        OnMouseDown(*pElem)
                                                    ;---------------------------------------------                                       
                                                    Case 2   ;Right button is pressed.
                                                        Debug "DOWN> Right button is pressed"                                         
                                                    Case 3   ;Left And right buttons are both pressed.
                                                        Debug "DOWN> Left And right buttons are both pressed"                                           
                                                    Case 4   ;Middle button is pressed.
                                                        Debug "DOWN> Middle button is pressed"                                         
                                                    Case 5   ;Left And middle buttons both are pressed.
                                                        Debug "DOWN> Left And middle buttons both are pressed"                                           
                                                    Case 6   ;Right And middle buttons are both pressed.
                                                        Debug "DOWN> Right And middle buttons are both pressed"                                         
                                                    Case 7   ;All three buttons are pressed.
                                                        Debug "DOWN> All three buttons are pressed"
                                                EndSelect
                                               
                                            Case #DISPID_MOUSEUP
                                                Select Button
                                                    Case 0   ;Default. No button is pressed.
                                                        Debug "UP> Default. No button is pressed"                                         
                                                    Case 1   ;Left button is pressed.
                                                        Debug "UP> Left button is pressed"                                         
                                                    Case 2   ;Right button is pressed.
                                                        Debug "UP> Right button is pressed"                                         
                                                    Case 3   ;Left And right buttons are both pressed.
                                                        Debug "UP> Left And right buttons are both pressed"                                           
                                                    Case 4   ;Middle button is pressed.
                                                        Debug "UP> Middle button is pressed"                                         
                                                    Case 5   ;Left And middle buttons both are pressed.
                                                        Debug "UP> Left And middle buttons both are pressed"                                           
                                                    Case 6   ;Right And middle buttons are both pressed.
                                                        Debug "UP> Right And middle buttons are both pressed"                                         
                                                    Case 7   ;All three buttons are pressed.
                                                        Debug "UP> All three buttons are pressed"
                                                EndSelect
                                               
                                        EndSelect
                                        *pElem\Release()
                                    EndIf
                                EndIf
                            EndIf
                        EndIf
                        *pEvtObj\Release()
                    EndIf
                EndIf
            EndIf
           
        Case "IID_DWebBrowserEvents2"
            Select dispIdMember   
                Case #DISPID_BEFORENAVIGATE2
                    *params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*6)
                    *params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*5)
                    *params3.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*4)
                    *params4.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*3)
                    *params5.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*2)
                    *params6.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
                    *params7.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
                    BeforeNavigate2(*params1\pdispVal,*params2\pvarVal,*params3\pvarVal,*params4\pvarVal,*params5\pvarVal,*params6\pvarVal,*params2\pboolVal)
                   
                   
                Case #DISPID_DOCUMENTCOMPLETE
                    *params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
                    *params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
                    DocumentComplete(*params1\pdispVal, *params2\pvarVal)   
                   
                Case #DISPID_NAVIGATEERROR
                    *params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*4)
                    *params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*3)
                    *params3.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*2)
                    *params4.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
                    *params5.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
                    NavigateError(*params1\pdispVal, *params2\pvarVal, *params3\pvarVal, *params4\pvarVal, *params5\pboolVal)
                   
                Case #DISPID_NEWWINDOW2
                    *params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
                    *params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
                    NewWindow2(*params1\ppdispVal, *params2\pboolVal)
                   
                Case #DISPID_PROGRESSCHANGE
                    *params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
                    *params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
                    ProgressChange(*params1\lVal, *params2\lVal)     
                   
                Case #DISPID_STATUSTEXTCHANGE
                    *params.VARIANT = *pDispParams\rgvarg
                    StatusTextChange(*params\bstrVal)
                   
                Case #DISPID_TITLECHANGE
                    *params.VARIANT = *pDispParams\rgvarg
                    TitleChange(*params\bstrVal)
                   
            EndSelect
    EndSelect
EndProcedure


AddElement(dispatchObject())
dispatchObject()\IDispatch = ?dispatchFunctions
dispatchObject()\Event="IID_DWebBrowserEvents2"

OpenWindow(0,0,0,640,520,"Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If CreateStatusBar(0, WindowID(0))
    AddStatusBarField(300)
    AddStatusBarField(300)
EndIf

StatusBarText(0, 0, "")
StatusBarText(0, 1, "")

CreateGadgetList(WindowID(0))
PanelGadget(0, 10, 50, 620, 420)
    AddGadgetItem (0, -1, "")
    WebGadget(1,10,10,600,380, "http://www.purebasic.fr/french/login.php?")
CloseGadgetList()

ProgressBarGadget(2,  10, 10, 200,  20, 0, 100)

webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(1), #GWL_USERDATA)
If webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)=#S_OK
    If connectionPointContainer
        If connectionPointContainer\FindConnectionPoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)=#S_OK
            If connectionPoint
                If connectionPoint\Advise(@dispatchObject(), @Cookie)=#S_OK
                    Connexion=1
                EndIf
                connectionPoint\Release()
            EndIf
        EndIf
        connectionPointContainer\Release()
    EndIf
EndIf
If Connexion=0
    MessageRequester("Info","La connexion à échouée")
EndIf

Repeat
    Event= WaitWindowEvent()
    Select Event
        Case #WM_KEYDOWN,#WM_KEYUP ; a mettre en place si on veut recevoir ces events dans le traitement HTMLElementEvents2
            ; ce n'est pas nécessaire si l'event #DISPID_KEYPRESS vous suffit
            webBrowser\QueryInterface(?IID_IOleInPlaceActiveObject, @OleObject.IOleInPlaceActiveObject)
            web.MSG\message = Event:web\wParam = EventwParam():web\lParam = EventlParam()
            OleObject\TranslateAccelerator(@web)
            OleObject\Release()

        Case #WM_CLOSE
            quit.l=1
    EndSelect
   
Until quit.l=1
End

DataSection
    IID_IOleInPlaceActiveObject:
    Data.l $00000117
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46
   
    CLSID_IOleInPlaceActiveObject:
    Data.l $00000320
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46

    dispatchFunctions:
    Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
    Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
   
    IID_IOleCommandTarget:
    Data.l $B722BCCB
    Data.w $4E68, $101B
    Data.b $A2, $BC, $00, $AA, $00, $40, $47, $70
   
    CGID_IWebBrowser:
    Data.l $ED016940
    Data.w $BD5B, $11CF
    Data.b $BA, $4E, $00, $C0, $4F, $D7, $08, $16
   
    IID_IWebBrowser2:
    Data.l $D30C1661
    Data.w $CDAF, $11D0
    Data.b $8A, $3E, $00, $C0, $4F, $C9, $E2, $6E
   
    IID_IConnectionPointContainer:
    Data.l $B196B284
    Data.w $BAB4, $101A
    Data.b $B6, $9C, $00, $AA, $00, $34, $1D, $07   
   
    IID_IDispatch:
    Data.l $00020400
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46
   
    IID_IUnknown:
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46
   
    IID_DWebBrowserEvents2:
    Data.l $34A715A0
    Data.w $6587, $11D0
    Data.b $92, $4A, $00, $20, $AF, $C7, $AC, $4D
   
    IID_IHTMLElement:
    Data.l $3050F1FF
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
   
    IID_IHTMLDocument2:
    Data.l $332C4425
    Data.w $26CB, $11D0
    Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
   
    DIID_HTMLElementEvents2:
    Data.l $3050F60F
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
   
    IID_IHTMLEventObj:
    Data.l $3050F32D
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
EndDataSection
Dernière modification par nico le jeu. 13/mars/2008 21:22, modifié 1 fois.
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

Message par SpaceMan »

Ces codes sont excellents nico :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

On peut capturer les évènements directement depuis la Callback Internet Explorer_Server et faire exactement la même chose plus simplement:


;Window
Enumeration
   #Main
EndEnumeration

;Gadget
Enumeration
   #Web
EndEnumeration

Global webBrowser.IWebBrowser2

Procedure EnumFunc(hchild.l,lParam.l)
  Protected class$
  class$= Space (30)
   GetClassName_ (hchild,@class$,29)
   Debug class$
   If class$= "Internet Explorer_Server"
     PokeL (lParam,hchild)
     ProcedureReturn 0
   EndIf
   ProcedureReturn 1
EndProcedure

Procedure OnMouseDown(*pElem.IHtmlElement)
    Protected lFlags.l,*bstr.l,AttributeValue.VARIANT,Propriete.s

     If *pElem
        lFlags.l=1
         If *pElem\getAttribute( "name" ,lFlags,@AttributeValue)= #S_OK
             If AttributeValue\vt= #VT_BSTR
                 If AttributeValue\bstrVal
                    Propriete= PeekS (AttributeValue\bstrVal,-1, #PB_Unicode )
                     SysFreeString_ (@AttributeValue\bstrVal)
                     If Propriete= "username"
                        *bstr.l = SysAllocString_ ( Space ((200*2)+2))
                         If *bstr
                             PokeS (*bstr, "Mon Login" ,-1, #PB_Unicode )
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute( "value" ,@AttributeValue,lFlags)
                             SysFreeString_ (@*bstr)
                         EndIf
                     ElseIf Propriete= "password"
                        *bstr.l = SysAllocString_ ( Space ((200*2)+2))
                         If *bstr
                             PokeS (*bstr, "Mon Mot de Passe" ,-1, #PB_Unicode )
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute( "value" ,@AttributeValue,lFlags)
                             SysFreeString_ (@*bstr)
                         EndIf
                     EndIf
                 EndIf
             EndIf
         EndIf
     EndIf
EndProcedure

Procedure NouvelleProc( Hwnd, msg, wParam, lParam)
  Protected OriginProc.l,X.l,Y.l,pDispatch.Idispatch,pDocument2.IHTMLDocument2,pElem.IHtmlElement
   ;Ici on récupère l'adresse d'origine de la procédure grâce à la
   ;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre
   ;voir la fonction SetProp.
  OriginProc.l= GetProp_ (hWnd, "OriginProc" )

   Select msg
     Case #WM_LBUTTONDOWN
      X = lParam&$FFFF
      Y = (lParam>>16)&$FFFF
       If webBrowser\get_document(@pDispatch) = #S_OK
         If pDispatch\QueryInterface(?IID_IHTMLDocument2, @pDocument2) = #S_OK
             If pDocument2\elementFromPoint(x , y , @pElem) = #S_OK
                OnMouseDown(pElem.IHtmlElement)
                pElem\Release()
             EndIf
            pDocument2\Release()
         EndIf
        pDispatch\Release()
       EndIf
      
     Case #WM_LBUTTONUP
         Debug "WM_LBUTTONUP"
        
     ;Case #WM_RBUTTONDOWN et ainsi de suite..
    
     Case #WM_CHAR
         Debug "Key= " + Chr (wParam)
        
     Case #WM_NCDESTROY
       RemoveProp_ (Hwnd, "OriginProc" )
       SetWindowLong_ (Hwnd, #GWL_WNDPROC , OriginProc)
   EndSelect
   ;On renvoie tous les autres évènements à la procédure d'origine.
   ProcedureReturn CallWindowProc_ (OriginProc,hWnd,msg,wParam,lParam)
EndProcedure

If OpenWindow ( #Main ,0,0,600,300, "WebGadget" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
   CreateGadgetList ( WindowID ( #Main ))
   WebGadget ( #Web ,10,10,580,280, "http://www.purebasic.fr/french/login.php" )
  
   ; Il faut subclasser la classe Internet_Server et non le Gadget lui même
   EnumChildWindows_ ( GadgetID ( #Web ),@EnumFunc(),@IExplorer_Server)
   If IExplorer_Server
    OriginProc = SetWindowLong_ (IExplorer_Server, #GWL_WNDPROC , @NouvelleProc())
     SetProp_ (IExplorer_Server, "OriginProc" , OriginProc)
   EndIf
 
  webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
 
   Repeat
    event= WaitWindowEvent ()
     Select event
       Case #WM_CLOSE
        Quit=1
     EndSelect
   Until Quit = 1
EndIf
End

DataSection
  IID_IHTMLDocument2:
   Data.l $332C4425
   Data.w $26CB, $11D0
   Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
EndDataSection
Dernière modification par nico le sam. 08/mars/2008 23:46, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Slt Nico, tu fais du trés bon boulot.... Continue comme ca :-)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Petit exemple d'Auto Login sur le Forum:



Interface IHTMLElementCollection_FIXED
  QueryInterface(a,b)
  AddRef()
  Release()
  GetTypeInfoCount(a)
  GetTypeInfo(a,b,c)
  GetIDsOfNames(a,b,c,d,e)
  Invoke(a,b,c,d,e,f,g,h)
  toString(a)
  put_length(a)
  get_length(a)
  get__newEnum(a)
  item(a1,a2,a3,a4,b1,b2,b3,b4,c)
  tags(a,b)
EndInterface

Structure VARIANT_SPLIT
  StructureUnion
    Variant.VARIANT
    Split.l[4]
  EndStructureUnion
EndStructure

;Window
Enumeration
   #Main
EndEnumeration

;Gadget
Enumeration
   #Web
EndEnumeration

Structure Login
    Url.s
    Nom.s
    Password.s
EndStructure

Global webBrowser.IWebBrowser2,UserName.s,Password.s
Global NewList AutoLogin.Login()

AddElement (AutoLogin())
AutoLogin()\Url= "http://www.purebasic.fr/french/login.php"
AutoLogin()\Nom= " ;<--- A remplir
AutoLogin()\Password= " ;<--- A remplir


Procedure Fill(*pElem.IHtmlElement)
    Protected lFlags.l,*bstr.l,AttributeValue.VARIANT,Propriete.s

     If *pElem
        lFlags.l=1
         If *pElem\getAttribute( "type" ,lFlags,@AttributeValue)= #S_OK
             If AttributeValue\vt= #VT_BSTR
                 If AttributeValue\bstrVal
                    Propriete= PeekS (AttributeValue\bstrVal,-1, #PB_Unicode )
                     SysFreeString_ (@AttributeValue\bstrVal)
                     If Propriete= "text"
                        *bstr.l = SysAllocString_ ( Space (( Len (AutoLogin()\Nom)*2)+2))
                         If *bstr
                             PokeS (*bstr,AutoLogin()\Nom,-1, #PB_Unicode )
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute( "value" ,@AttributeValue,lFlags)
                             SysFreeString_ (@*bstr)
                         EndIf
                     ElseIf Propriete= "password"
                        *bstr.l = SysAllocString_ ( Space (( Len (AutoLogin()\Password)*2)+2))
                         If *bstr
                             PokeS (*bstr,AutoLogin()\Password,-1, #PB_Unicode )
                            AttributeValue\bstrVal=*bstr
                            *pElem\SetAttribute( "value" ,@AttributeValue,lFlags)
                             SysFreeString_ (@*bstr)
                         EndIf
                     ElseIf Propriete= "submit"
                        *pElem\Click()
                         ProcedureReturn 1
                     EndIf
                 EndIf
             EndIf
         EndIf
     EndIf
     ProcedureReturn 0
EndProcedure

Procedure ProcessElementCollection(*pElemColl.IHTMLElementCollection_FIXED)
    Protected *pElemDisp.IDispatch = #Null
    Protected *pElem.IHTMLElement = #Null
    Protected a.l,long.l,*bstr
   
    varIndex2.VARIANT_SPLIT\Variant\vt = #VT_I4
   
    *pElemColl\get_length(@long.l)
   
     For a=0 To long-1
      varIndex2.VARIANT_SPLIT\Variant\lval= a
       If *pElemColl\item(varIndex2\split[0], varIndex2\split[1], varIndex2\split[2], varIndex2\split[3], varIndex2\split[0], varIndex2\split[1], varIndex2\split[2], varIndex2\split[3], @*pElemDisp.IDispatch)= #S_OK
             If *pElemDisp
                 If *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElem.IHTMLElement)= #S_OK
                     If *pElem
                          *bstr.l = SysAllocString_ ( Space ((10*2)+2))
                           If *bstr
                              *pElem\Get_TagName(@*bstr)
                               If PeekS (*bstr,-1, #PB_Unicode )= "INPUT"
                                   If Fill(*pElem.IHtmlElement)
                                    a=long
                                   EndIf
                               EndIf
                               SysFreeString_ (@*bstr)
                           EndIf
                        *pElem\Release()
                     EndIf
                 EndIf
                *pElemDisp\Release()
             EndIf
         EndIf
     Next a
EndProcedure

Procedure ProcessDocument(*pDoc.IHTMLDocument2)
    Protected *pElemColl.IHTMLElementCollection_FIXED = #Null
   
     If *pDoc\get_all(@*pElemColl)= #S_OK
         If *pElemColl
             ;// Obtained element collection.
            ProcessElementCollection(*pElemColl)
            *pElemColl\Release()
         EndIf
     EndIf
EndProcedure

Procedure Auto_Login(Url.s)
    Protected *pDispatch.IDispatch,*pDocument2.IHTMLDocument2
    Protected hr.l,Ret.l

    
      ForEach AutoLogin()
          If AutoLogin()\Url=Url
            Ret=1
            Break
          EndIf
      Next
    
      If Ret
        hr= WebBrowser\get_document(@*pDispatch)
          If hr=0 And *pDispatch>0
            hr=*pDispatch\QueryInterface(?IID_IHTMLDocument2, @*pDocument2)
              If hr=0 And *pDocument2>0
                 ProcessDocument(*pDocument2)
                *pDocument2\Release()
              EndIf
            *pDispatch\Release()
          EndIf
      EndIf
EndProcedure

If OpenWindow ( #Main ,0,0,800,600, "WebGadget" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
   CreateGadgetList ( WindowID ( #Main ))
   WebGadget ( #Web ,10,10,780,580, "http://www.purebasic.fr/french/login.php" )
 
  webBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )
 
   Repeat
    event= WaitWindowEvent ()
     Select event
       Case #PB_Event_Gadget
         Select EventGadget ()
             Case #Web
                 Select EventType ()
                   Case #PB_EventType_DownloadEnd
                      Url.s= GetGadgetText ( #Web )
                      Auto_Login(Url)
                 EndSelect
         EndSelect
       Case #WM_CLOSE
        Quit=1
     EndSelect
   Until Quit = 1
EndIf
End

DataSection
  IID_IHTMLElement:
   Data.l $3050F1FF
   Data.w $98B5, $11CF
   Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

  IID_IHTMLDocument2:
   Data.l $332C4425
   Data.w $26CB, $11D0
   Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
EndDataSection
Dernière modification par nico le sam. 08/mars/2008 23:45, modifié 1 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Sympa ce code, et comment faire pour se connecter automatiquement sur le forum developpez.com ? Il faut changer quoi ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code mis à jour!
Dernière modification par nico le sam. 08/mars/2008 23:42, modifié 1 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Impeccable :P

ça fonctionne très bien pour se loguer automatiquement, par contre après pour naviguer c'est pas évident.
Alors que la navigation sur ce forum fonctionne très bien , si ça merdouille avec le forum DVP ça tient au fait que le login est sur la même page ?

Merci , je vais quand même l'ajouter comme sources sur DVP :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui, c'est ça, mais là c'est juste un exemple bidon, pour être complet, faudrait vérifier dans la page après connexion, le lien de déconnexion ou la page de redirection.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Si tu veux, je peux essayer de faire un code plus générique, avec test de connexion (réussi ou échec), je changerais le code en prenant Get_Forms au lieu de Get_All.

Mais faudra que tu attendes ce week end!
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ça serait intéressant , merci.

Pas de souci, je peux attendre ce week-end , prends ton temps.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre