This code is maybe dirty (i just put together different things as demostration not as a real example) but shows that you can get the form values easily without the need to navigate.
Code: Select all
DataSection
IID_IHTMLDocument: ; {626FC520-A41E-11CF-A731-00A0C9082637}
Data.l $626FC520
Data.w $A41E, $11CF
Data.b $A7, $31, $00, $A0, $C9, $08, $26, $37
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
Procedure MakeBSTR(String$)
Unicode$ = Space(Len(String$)*2+2)
MultiByteToWideChar_(#CP_ACP, 0, @String$, -1, @Unicode$, Len(String$)*2+2)
ProcedureReturn SysAllocString_(@Unicode$)
EndProcedure
Procedure.s ReadBSTR(bstr)
length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, 0, 0, 0, 0)
Text$ = Space(length)
WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, @Text$, length, 0, 0)
ProcedureReturn Text$
EndProcedure
Procedure.s StringFromVARIANT(*var.VARIANT)
If VariantChangeType_(*var, *var, $2, #VT_BSTR) = #S_OK
Result$ = ReadBSTR(*var\bstrVal)
SysFreeString_(*var\bstrVal)
Else
Result$ = "ERROR : Cannot convert VARIANT to String!"
EndIf
ProcedureReturn Result$
EndProcedure
Procedure.s GetJSVariable(Gadget, Name$) ;obtiene variables js
Result$ = "ERROR"
Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document.IHTMLDocument) = #S_OK
If Document\get_Script(@Script.IDispatch) = #S_OK
bstr_name = MakeBSTR(Name$)
Result = Script\GetIDsOfNames(?IID_NULL, @bstr_name, 1, 0, @dispID.l)
If Result = #S_OK
params.DISPPARAMS\cArgs = 0
params\cNamedArgs = 0
Result = Script\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @params, @varResult.VARIANT, 0, 0)
If Result = #S_OK
Result$ = StringFromVARIANT(@varResult)
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, Result, 0, @Message$, 3000, 0)
Result$ = "ERROR: Invoke() "+Message$
EndIf
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, Result, 0, @Message$, 3000, 0)
;Result$ = "ERROR: GetIDsOfNames() "+Message$
EndIf
SysFreeString_(bstr_name)
Script\Release()
EndIf
Document\Release()
EndIf
DocumentDispatch\Release()
EndIf
ProcedureReturn Result$
EndProcedure
Procedure ResizeWebWindow()
ResizeGadget(10, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0)-52)
ResizeGadget(4, #PB_Ignore, #PB_Ignore, WindowWidth(0)-185, #PB_Ignore)
ResizeGadget(5, WindowWidth(0)-25, #PB_Ignore, #PB_Ignore, #PB_Ignore)
ResizeGadget(6, #PB_Ignore, #PB_Ignore, WindowWidth(0), #PB_Ignore)
EndProcedure
Procedure NavigationCallback(Gadget, Url$)
Debug "Navigating to: " + Url$
; stop evil MS pages from being viewed :D
If FindString(Url$, "microsoft", 1) = 0
ProcedureReturn #True
Else
MessageRequester("PureBasic MiniBrowser v1.0", "No evil MS pages please ;)")
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s RunJSFunction(Gadget, Function$, Arguments$, Separator$) ;corre funciones js
Result$ = "ERROR"
Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document.IHTMLDocument) = #S_OK
If Document\get_Script(@Script.IDispatch) = #S_OK
bstr_command = MakeBSTR(Function$)
Result = Script\GetIDsOfNames(?IID_NULL, @bstr_command, 1, 0, @dispID.l)
If Result = #S_OK
; parse the arguments
;
If Trim(Arguments$) = ""
Count = 0
*Arguments = 0
Else
Count = CountString(Arguments$, Separator$)+1
*Arguments = AllocateMemory(SizeOf(VARIANT)*Count)
*Arg.VARIANT = *Arguments
For i = 1 To Count
*Arg\vt = #VT_BSTR
*Arg\bstrVal = MakeBSTR(StringField(Arguments$, i, Separator$))
*Arg + SizeOf(VARIANT)
Next i
EndIf
params.DISPPARAMS\cArgs = Count
params\cNamedArgs = 0
params\rgvarg = *Arguments
Result = Script\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_METHOD, @params, @varResult.VARIANT, 0, 0)
If Result = #S_OK
Result$ = StringFromVARIANT(@varResult)
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, Result, 0, @Message$, 3000, 0)
Result$ = "ERROR: Invoke() "+Message$
EndIf
If *Arguments
*Arg.VARIANT = *Arguments
For i = 1 To Count
SysFreeString_(*Arg\bstrVal)
*Arg + SizeOf(VARIANT)
Next i
FreeMemory(*Arguments)
EndIf
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, Result, 0, @Message$, 3000, 0)
Result$ = "ERROR: GetIDsOfNames() "+Message$
EndIf
SysFreeString_(bstr_command)
Script\Release()
EndIf
Document\Release()
EndIf
DocumentDispatch\Release()
EndIf
ProcedureReturn Result$
EndProcedure
HTMLPage$ = "<script type='text/javascript'>"
HTMLPage$+ "var result;"
HTMLPage$+ "function Clean(){ result=''};"
HTMLPage$+ "function isEmpty(elem, helperMsg){"
HTMLPage$+ " if(elem.value.length == 0){"
;HTMLPage$+ " alert(helperMsg);"
HTMLPage$+ " elem.focus();"
HTMLPage$+ " return true;"
HTMLPage$+ " }else{"
;HTMLPage$+ " alert(elem.value);"
HTMLPage$+ " result = elem.value;"
HTMLPage$+ " }"
HTMLPage$+ " return false;"
HTMLPage$+ "}"
HTMLPage$+ "</script>"
HTMLPage$+ "<form>"
HTMLPage$+ "Required Field: <input type='text' value='hello' id='req1'/>"
HTMLPage$+ "<input type='button' "
HTMLPage$+ " onclick=" + Chr(34) + "isEmpty(document.getElementById('req1'), 'Please Enter a Value')" + Chr(34)
HTMLPage$+ " value='Check Field' />"
HTMLPage$+ "</form>"
If OpenWindow(0, 100, 200, 500, 300, "PureBasic MiniBrowser v1.0", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
CreateStatusBar(0, WindowID(0))
StatusBarText(0, 0, "Welcome to the world's smallest Browser ! :)", 0)
CreateGadgetList(WindowID(0))
ButtonGadget(1, 0, 0, 50, 25, "Back")
ButtonGadget(2, 50, 0, 50, 25, "Next")
ButtonGadget(3, 100, 0, 50, 25, "Stop")
StringGadget(4, 155, 5, 0, 20, "http://www.google.com")
ButtonGadget(5, 0, 0, 25, 25, "Go")
Frame3DGadget(6, 0, 29, 0, 2, "", 2) ; Nice little separator
If WebGadget(10, 0, 34, 0, 0, "about:" + HTMLPage$) = 0 : MessageRequester("Error", "ATL.dll Not found", 0) : End : EndIf
SetGadgetAttribute(10, #PB_Web_BlockPopups, 1) ; disable popup windows
SetGadgetAttribute(10, #PB_Web_BlockPopupMenu, 1) ; disable popup menu
SetGadgetAttribute(10, #PB_Web_NavigationCallback, @NavigationCallback()) ; set navigation callback
AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)
ResizeWebWindow()
;SetGadgetItemText(10,#PB_Web_HtmlCode,HTMLPage$)
Repeat
Event = WaitWindowEvent()
;Find if some JS variable has any value
JSVar$ = GetJSVariable(10,"result")
If JSVar$ And JSVar$ <> "ERROR"
RunJSFunction(10,"Clean","","")
Debug "Javascript variable value: " + JSVar$
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
SetGadgetState(10, #PB_Web_Back)
Case 2
SetGadgetState(10, #PB_Web_Forward)
Case 3
SetGadgetState(10, #PB_Web_Stop)
Case 5
SetGadgetText(10, GetGadgetText(4))
Case 10
Select EventType()
Case #PB_EventType_TitleChange
Title$ = GetGadgetItemText(10, #PB_Web_PageTitle)
If Title$ = ""
SetWindowTitle(0, "PureBasic MiniBrowser v1.0")
Else
SetWindowTitle(0, Title$ + " - PureBasic MiniBrowser v1.0")
EndIf
Case #PB_EventType_StatusChange
StatusBarText(0, 0, GetGadgetItemText(10, #PB_Web_StatusMessage), 0)
Case #PB_EventType_PopupWindow
MessageRequester("PureBasic MiniBrowser v1.0", "A popup window was blocked!")
Case #PB_EventType_DownloadStart
Debug "Download starting"
Case #PB_EventType_DownloadProgress
Debug "Progress: "+Str(GetGadgetAttribute(10, #PB_Web_Progress))+" of " + Str(GetGadgetAttribute(10, #PB_Web_ProgressMax))
Case #PB_EventType_DownloadEnd
Debug "Download ended"
Case #PB_EventType_PopupMenu
MessageRequester("PureBasic MiniBrowser v1.0", "No popup menu available!")
Default
Debug "unknown event"
EndSelect
EndSelect
Case #PB_Event_Menu ; We only have one shortcut
If GetActiveGadget() = 4 ; Check if the return was pressed inside the string
SetGadgetText(10, GetGadgetText(4))
EndIf
Case #PB_Event_SizeWindow
ResizeWebWindow()
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf