Seite 2 von 7

Verfasst: 23.09.2006 21:08
von freak
Also im Prinzip kann man mit dem WebGadget so ziemlich alles anstellen, man muss
nur wissen wie. Leider ist das doch ziemlich komplex, desshalb kann man das nicht
in ein paar Sätzen erklären.

Ich dachte eigentlich ich hätte sowas schonmal irgendwo gepostet,
aber ich denke das hier sollte dir helfen:

Code: Alles auswählen

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
    
  IID_IHTMLDocument3: ; {3050F485-98B5-11CF-BB82-00AA00BDCE0B}
    Data.l $3050F485
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $00, $00, $00, $00, $00, $00, $00, $00
    
EndDataSection

; Nur eine Hilfsfunktion
;
Procedure WebGadget_Document(Gadget, *IID)
  Document = 0

  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
  If Browser
    If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK And DocumentDispatch
      DocumentDispatch\QueryInterface(*IID, @Document)
      DocumentDispatch\Release()
    EndIf
  EndIf      
      
  ProcedureReturn Document
EndProcedure


; Gibt den markierten Text zurück
;
Procedure.s WebGadget_Selection(Gadget)
  Result$ = ""
              
  Document.IHTMLDocument2 = WebGadget_Document(Gadget, ?IID_IHTMLDocument2)
  If Document
    If Document\get_selection(@Selection.IHTMLSelectionObject) = #S_OK
    
      If Selection\get_type(@bstr_type) = #S_OK And bstr_type
        If LCase(PeekS(bstr_type, -1, #PB_Unicode)) = "text"            
        
          If Selection\createRange(@TextRange.IDispatch) = #S_OK And TextRange
          
            UnicodeText$ = Space(10)                
            PokeS(@UnicodeText$, "text", -1, #PB_Unicode)                
            pUnicodeText = @UnicodeText$
            If TextRange\GetIDsOfNames(?IID_NULL, @pUnicodeText, 1, #LOCALE_SYSTEM_DEFAULT, @dispid_text) = #S_OK
            
              params.DISPPARAMS\cArgs = 0
              params\cNamedArgs = 0                                 
              If TextRange\Invoke(dispid_text, ?IID_NULL, #LOCALE_SYSTEM_DEFAULT, #DISPATCH_PROPERTYGET, @params, @varResult.VARIANT, #Null, #Null) = #S_OK 
                If varResult\vt <> #VT_BSTR
                  VariantChangeType_(@varResult, @varResult, 0, #VT_BSTR)
                EndIf 
                
                If varResult\vt = #VT_BSTR
                  Result$ = PeekS(varResult\bstrVal, -1, #PB_Unicode)
                EndIf
                
                VariantClear_(@varResult)
              EndIf                  
            EndIf
            
            TextRange\Release()
          EndIf
        
        EndIf
        SysFreeString_(bstr_type)
      EndIf          
    
      Selection\Release()
    EndIf             

    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure


; Gibt alles was innerhalb des <BODY> tags an reinem Text vorhanden ist zurück,
; also im Prinzip den ganzen Text der angezeigt wird
;
Procedure.s WebGadget_PageText(Gadget)
  Result$ = ""

  Document.IHTMLDocument2 = WebGadget_Document(Gadget, ?IID_IHTMLDocument2)
  If Document
    If Document\get_body(@Body.IHTMLElement) = #S_OK    
      If Body\get_innerText(@bstr_text) = #S_OK And bstr_text
        Result$ = PeekS(bstr_text, -1, #PB_Unicode)
        SysFreeString_(bstr_text)
      EndIf          
  
      Body\Release()  
    EndIf        
    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure


; Gibt den kompletten HTML code zurück
;
Procedure.s WebGadget_PageHtml(Gadget)
  Result$ = ""

  Document.IHTMLDocument3 = WebGadget_Document(Gadget, ?IID_IHTMLDocument3)
  If Document
    If Document\get_documentElement(@Root.IHTMLElement) = #S_OK
      If Root\get_outerHTML(@bstr_html) = #S_OK And bstr_html
        Result$ = PeekS(bstr_html, -1, #PB_Unicode)
        SysFreeString_(bstr_html)
      EndIf
      
      Root\Release()
    EndIf                       
    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure

; ===================================================================
; Beispiel
; ===================================================================


Enumeration
  #Web
  #Editor
  #Button1
  #Button2
  #Button3
EndEnumeration

If OpenWindow(0, 0, 0, 500, 600, "Web", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  CreateGadgetList(WindowID(0))
  
  WebGadget(#Web, 10, 10, 480, 300, "www.purebasic.com")
  ButtonGadget(#Button1, 10, 320, 120, 25, "Text")
  ButtonGadget(#Button2, 140, 320, 120, 25, "Html")
  ButtonGadget(#Button3, 270, 320, 120, 25, "Selection")
  EditorGadget(#Editor, 10, 355, 480, 235)
  
  Repeat
    Event = WaitWindowEvent()    
    
    If Event = #PB_Event_Gadget 
      Select EventGadget()
        Case #Button1: SetGadgetText(#Editor, WebGadget_PageText(#Web))
        Case #Button2: SetGadgetText(#Editor, WebGadget_PageHtml(#Web))
        Case #Button3: SetGadgetText(#Editor, WebGadget_Selection(#Web))
      EndSelect      
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
End
Für konkrete Fragen bin ich gerne offen, aber das ganze von A-Z zu erklären dauert
mir dann doch zu lange.

Verfasst: 23.09.2006 23:41
von Kaeru Gaman
@roherter

so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.


@onny

auswerten, der Wert

interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein

Verfasst: 24.09.2006 08:40
von onny
Kaeru Gaman hat geschrieben:@roherter
so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.
@onny
auswerten, der Wert
interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein
hey cool, danke, hier lernt man nicht nur pb :wink:

@freak: danke, werde den code gleich nach dem essen ausprobieren :D

Verfasst: 24.09.2006 08:47
von roherter
Kaeru Gaman hat geschrieben:@roherter

so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.


@onny

auswerten, der Wert

interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein
Danke, wollte ich schon immer mal haben :freak: .

Verfasst: 24.09.2006 19:45
von onny
@freak:
erstmal danke :D
einfach zu verstehen ist dein code nicht und funktionieren will er auch nicht so richtig... ist der code für pb 4.0? bei mir kommt ein Fehler wegen dem #PB_Unicode und noch ein paar weitere... :cry:
Leider bin ich in PB noch nicht begabt genug um mit den Fehlern zurecht zu kommen :freak:
Also eigentlich brauch ich nur das mit dem makierten Text... ohne das es halt nun wirklich markiert ist. :freak: Da ich wie schon oft gesagt den Quelltext nicht auslesen kann. :?

Verfasst: 25.09.2006 13:15
von freak
Ja, ist PB4 code. Für 3.94 fehlen ein paar Strukturen, und das mit dem Peek/Poke geht nicht.

> Also eigentlich brauch ich nur das mit dem makierten Text... ohne das es halt nun wirklich markiert ist.

Sorry, das kapier ich nicht. Vielleicht sagst du mal was du genau machen willst.

Verfasst: 25.09.2006 17:29
von onny
Hab ich mir gedacht :D Dann fang ich mal vom Anfang an.
1. Das Webgadget sendet ein <form ...> automatisch ab. (z.B. Login auf googlemail.com)
2. Der Quelltext kann von der aktuellen Seite nicht ausgelsen werden, da der GetGadgetText() noch die "URADRESSE" beinhaltet.
Z.B.
- http://www.web.de/login.php
Die Seite, die nach dem automatisch abgesendeten <form> kommt kann ich so nicht auslesen. Die Parameter sind meist SSL-Verschlüsselt und zu lang.
3. Jetzt gibt es ja die Methode einen makierten Text im WebGadget auszulesen. Das ist recht nützlich, da das Programm nicht auf den Sourcecode der Seite zurückgreift sondernden Text ausliest der "wirklich" darsteht.
4. Nun ist es bei einem automatischen Login-Script nicht gerade von Vorteil wenn der User immer bestimmten Text makieren muss, damit das Programm die Informationen der neuen Seite auswerten kann :D
5. So kam ich auf die Idee die PHP-Seite mit abgesendeten <form> OHNE Parameter auszuwerten....

Ich hoffe es ist nun etwas verständlicher :D

Verfasst: 25.09.2006 22:12
von bluejoke
Nein, ich hab dich nicht verstanden, bin grad aber auch leider mit nem Mathe-Problem abgelenkt, aber vielleicht hast du einfach nur ein Problem mit Frames? Oder mit Ajax, damit neuer Code auch in deinem Programm ankommt, muss dieses dann natürlich Javascript ausführen können, wenns dir aber um Googlemail geht: Da gibts ne API von Google dazu!

Verfasst: 26.09.2006 19:27
von onny
:bluescreen:
@freak: dein code vorher scheint sehr gut zu sein! kannst du ihn mir bitte (oder jemand anderes) in eine alte pb version konvertieren? bittööö :cry:
das ist auch das letzte was ich zu diesem thema frage :praise:

Verfasst: 30.09.2006 08:23
von onny
dieser code funktioniert bei mir, aber wie wende ich ihn an?

Code: Alles auswählen

;
; Get HTML Text In WebGadget
;
; NOT COMPATIBLE WITH FREAK'S WebGadgetExtras.pb
;
Interface IHTMLDocument2_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)
  get_Script(a)
  get_all(a)
  get_body(a)
  get_activeElement(a)
  get_images(a)
  get_applets(a)
  get_links(a)
  get_forms(a)
  get_anchors(a)
  put_title(a)
  get_title(a)
  get_scripts(a)
  put_designMode(a)
  get_designMode(a)
  get_selection(a)
  get_readyState(a)
  get_frames(a)
  get_embeds(a)
  get_plugins(a)
  put_alinkColor(a)
  get_alinkColor(a)
  put_bgColor(a)
  get_bgColor(a)
  put_fgColor(a)
  get_fgColor(a)
  put_linkColor(a)
  get_linkColor(a)
  put_vlinkColor(a)
  get_vlinkColor(a)
  get_referrer(a)
  get_location(a)
  get_lastModified(a)
  put_URL(a)
  get_URL(a)
  put_domain(a)
  get_domain(a)
  put_cookie(a)
  get_cookie(a)
  put_expando(a)
  get_expando(a)
  put_charset(a)
  get_charset(a)
  put_defaultCharset(a)
  get_defaultCharset(a)
  get_mimeType(a)
  get_fileSize(a)
  get_fileCreatedDate(a)
  get_fileModifiedDate(a)
  get_fileUpdatedDate(a)
  get_security(a)
  get_protocol(a)
  get_nameProp(a)
  write(a)
  writeln(a)
  open(a,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4,e)
  close()
  clear()
  queryCommandSupported(a,b)
  queryCommandEnabled(a,b)
  queryCommandState(a,b)
  queryCommandIndeterm(a,b)
  queryCommandText(a,b)
  queryCommandValue(a,b)
  execCommand(a,b,c,d)
  execCommandShowHelp(a,b)
  createElement(a,b)
  put_onhelp(a1,a2,a3,a4)
  get_onhelp(a)
  put_onclick(a1,a2,a3,a4)
  get_onclick(a)
  put_ondblclick(a1,a2,a3,a4)
  get_ondblclick(a)
  put_onkeyup(a1,a2,a3,a4)
  get_onkeyup(a)
  put_onkeydown(a1,a2,a3,a4)
  get_onkeydown(a)
  put_onkeypress(a1,a2,a3,a4)
  get_onkeypress(a)
  put_onmouseup(a1,a2,a3,a4)
  get_onmouseup(a)
  put_onmousedown(a1,a2,a3,a4)
  get_onmousedown(a)
  put_onmousemove(a1,a2,a3,a4)
  get_onmousemove(a)
  put_onmouseout(a1,a2,a3,a4)
  get_onmouseout(a)
  put_onmouseover(a1,a2,a3,a4)
  get_onmouseover(a)
  put_onreadystatechange(a1,a2,a3,a4)
  get_onreadystatechange(a)
  put_onafterupdate(a1,a2,a3,a4)
  get_onafterupdate(a)
  put_onrowexit(a1,a2,a3,a4)
  get_onrowexit(a)
  put_onrowenter(a1,a2,a3,a4)
  get_onrowenter(a)
  put_ondragstart(a1,a2,a3,a4)
  get_ondragstart(a)
  put_onselectstart(a1,a2,a3,a4)
  get_onselectstart(a)
  elementFromPoint(a,b,c)
  get_parentWindow(a)
  get_styleSheets(a)
  put_onbeforeupdate(a1,a2,a3,a4)
  get_onbeforeupdate(a)
  put_onerrorupdate(a1,a2,a3,a4)
  get_onerrorupdate(a)
  toString(a)
  createStyleSheet(a,b,c)
EndInterface

Interface IHTMLElement_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)
  setAttribute(a,b,c)
  getAttribute(a,b,c)
  removeAttribute(a,b,c)
  put_className(a)
  get_className(a)
  put_id(a)
  get_id(a)
  get_tagName(a)
  get_parentElement(a)
  get_style(a)
  put_onhelp(a1,a2,a3,a4)
  get_onhelp(a)
  put_onclick(a1,a2,a3,a4)
  get_onclick(a)
  put_ondblclick(a1,a2,a3,a4)
  get_ondblclick(a)
  put_onkeydown(a1,a2,a3,a4)
  get_onkeydown(a)
  put_onkeyup(a1,a2,a3,a4)
  get_onkeyup(a)
  put_onkeypress(a1,a2,a3,a4)
  get_onkeypress(a)
  put_onmouseout(a1,a2,a3,a4)
  get_onmouseout(a)
  put_onmouseover(a1,a2,a3,a4)
  get_onmouseover(a)
  put_onmousemove(a1,a2,a3,a4)
  get_onmousemove(a)
  put_onmousedown(a1,a2,a3,a4)
  get_onmousedown(a)
  put_onmouseup(a1,a2,a3,a4)
  get_onmouseup(a)
  get_document(a)
  put_title(a)
  get_title(a)
  put_language(a)
  get_language(a)
  put_onselectstart(a1,a2,a3,a4)
  get_onselectstart(a)
  scrollIntoView(a)
  contains(a,b)
  get_sourceIndex(a)
  get_recordNumber(a)
  put_lang(a)
  get_lang(a)
  get_offsetLeft(a)
  get_offsetTop(a)
  get_offsetWidth(a)
  get_offsetHeight(a)
  get_offsetParent(a)
  put_innerHTML(a)
  get_innerHTML(a)
  put_innerText(a)
  get_innerText(a)
  put_outerHTML(a)
  get_outerHTML(a)
  put_outerText(a)
  get_outerText(a)
  insertAdjacentHTML(a,b)
  insertAdjacentText(a,b)
  get_parentTextEdit(a)
  get_isTextEdit(a)
  click()
  get_filters(a)
  put_ondragstart(a1,a2,a3,a4)
  get_ondragstart(a)
  toString(a)
  put_onbeforeupdate(a1,a2,a3,a4)
  get_onbeforeupdate(a)
  put_onafterupdate(a1,a2,a3,a4)
  get_onafterupdate(a)
  put_onerrorupdate(a1,a2,a3,a4)
  get_onerrorupdate(a)
  put_onrowexit(a1,a2,a3,a4)
  get_onrowexit(a)
  put_onrowenter(a1,a2,a3,a4)
  get_onrowenter(a)
  put_ondatasetchanged(a1,a2,a3,a4)
  get_ondatasetchanged(a)
  put_ondataavailable(a1,a2,a3,a4)
  get_ondataavailable(a)
  put_ondatasetcomplete(a1,a2,a3,a4)
  get_ondatasetcomplete(a)
  put_onfilterchange(a1,a2,a3,a4)
  get_onfilterchange(a)
  get_children(a)
  get_all(a)
EndInterface
;
Procedure.l GetBSTRLength(bstr)
  Length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, 0, 0, 0, 0)
  ProcedureReturn Length
EndProcedure
;
Procedure.l ReadBSTRMem(*Buffer, bstr, Length)
  Length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, *Buffer, Length, 0, 0)   
  ProcedureReturn Length
EndProcedure
;
Procedure WebGadget_GextHTMLText(WebGadget.l)
  Protected WebObject.IWebBrowser2, HTMLDoc.IHTMLDocument2_FIXED, DocDispatch.IDispatch, HTMLElement.IHTMLElement_FIXED
  WebObject = GetWindowLong_(GadgetID(WebGadget), #GWL_USERDATA)
 
  If WebObject\get_document(@DocDispatch) = #S_OK
    If DocDispatch\QueryInterface(?IID_IHTMLDocument2, @HTMLDoc) = #S_OK
      If HTMLDoc\get_body(@HTMLElement) = #S_OK
        If HTMLElement\get_innerHTML(@bstr_code) = #S_OK
         
          bstr_len = GetBSTRLength(bstr_code)
          If bstr_len
            *Buffer = AllocateMemory(bstr_len)
            If *Buffer
              If ReadBSTRMem(*Buffer, bstr_code, bstr_len) ; Get HTML code in *Buffer
                Debug PeekS(*Buffer) ; [warning string size limitation, better use memory functions !]
              EndIf
              FreeMemory(*Buffer)
            EndIf
          EndIf
         
          SysFreeString_(bstr_code)
        EndIf
      EndIf
      DocDispatch\Release()
    EndIf
  EndIf
  ProcedureReturn
 
EndProcedure

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