_IE bzw GDIPlus Problem

  • Also Ich bin dran einen "PageAnalyzer" zu schreiben, der dir für Diverse Objekte in IE die richtige oder bestmögliche ansprechvariante liefert.

    nun häng ich aber gerade an einer Obtischen Feinheit, ich möchte ja auch das man bei klick auf die Obj sieht welches Obj gerade gewählt wurd, aus diesemgrund habe ich mich gerade mit Gdiplus auseinandergesetzt mit mehr oder weniger grossen Erfolg

    Z.B., wird nun das Obj auch dann markiert wenn es eigendlich schon gelöscht sein sollt

    Die Funktion die das Problem auslösst

    [autoit]

    Func _ItemMark()
    AdlibUnRegister("_ItemMark")
    _GDIPlus_Startup()
    If IsDeclared($hGraphic) Then _GDIPlus_GraphicsDispose($hGraphic)
    $id = GUICtrlRead($oGUI_List)
    $oObj = $iItems[$id]
    $iScreenX = _IEPropertyGet($oObj, "screenx")
    $iScreenY = _IEPropertyGet($oObj, "screeny")
    $iWidth = _IEPropertyGet($oObj, "width")
    $iHeight = _IEPropertyGet($oObj, "height")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($oIE)
    $hPen = _GDIPlus_PenCreate()
    _GDIPlus_PenSetColor($hPen, 0xFFFF0000)
    _GDIPlus_GraphicsDrawRect($hGraphic, $iScreenX, $iScreenY, $iWidth, $iHeight, $hPen)
    Do
    Sleep(100)
    _GDIPlus_GraphicsDrawRect($hGraphic, $iScreenX, $iScreenY, $iWidth, $iHeight, $hPen)
    Until not (GUICtrlRead($oGUI_List) = $id)
    _GDIPlus_Shutdown()
    AdlibRegister("_ItemMark", 100)
    EndFunc

    [/autoit]


    Das gesamte Script (bis jetzt)

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <TreeViewConstants.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $oIE
    Global $iItems
    Global $id = 0, $hGraphic = 0
    Dim $iItems[200000]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $oGui = GUICreate("InfoTool 4 IE", 700, 600, @DesktopWidth - 710, 10)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Gui_Close")
    $oGui_Input_AttachString = GUICtrlCreateInput("Google", 5, 5, 300, 21)
    $oGui_Combo_AttachMode = GUICtrlCreateCombo("", 310, 5, 150, 21)
    GUICtrlSetData(-1, "Titel|WindowTitle|URL|Text|HTML|", "Text")
    GUICtrlSetTip(-1, _
    "Title = Teil des Titels des Hauptdokuments" & @CRLF & _
    "WindowTitle = Teil des gesamten Fenstertitels (anstelle des Dokumenttitels)" & @CRLF & _
    "URL = (Standard) Teilstring oder URL der aktuellen Internetadresse" & @CRLF & _
    "Text = Teilstring im Text des Bodys der aktuellen Seite" & @CRLF & _
    "HTML = Teilstring im HTML des Bodys der aktuellen Seite")

    [/autoit] [autoit][/autoit] [autoit]

    $oGui_Button_AttachStart = GUICtrlCreateButton("Verbinden", 465, 5, 230, 21, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_AttachStart")

    [/autoit] [autoit][/autoit] [autoit]

    Global $oGUI_List = GUICtrlCreateTreeView(5, 30, 200, 560, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
    $oGui_List_Menu = GUICtrlCreateContextMenu($oGUI_List)
    GUICtrlCreateMenuItem("Untersuchen", $oGui_List_Menu)
    GUICtrlSetOnEvent(-1, "_ItemCheck")
    GUICtrlCreateMenuItem("Markieren", $oGui_List_Menu)
    GUICtrlSetOnEvent(-1, "_ItemMark")

    [/autoit] [autoit][/autoit] [autoit]

    Global $oGUI_List_Links = GUICtrlCreateTreeViewItem("Links", $oGUI_List)
    Global $oGUI_List_Inputs = GUICtrlCreateTreeViewItem("Inputs", $oGUI_List)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("_ItemMark", 100)
    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Gui_Close()
    Exit
    EndFunc ;==>_Gui_Close

    [/autoit] [autoit][/autoit] [autoit]

    Func _AttachStart()
    $oIE = _IEAttach(GUICtrlRead($oGui_Input_AttachString), GUICtrlRead($oGui_Combo_AttachMode))
    If $oIE = 0 Then
    MsgBox(0, "", "Konnte leider nicht zu dem Broser verbinden und starte ihn deshalb")
    $oIE = _IECreate("www.google.de")
    Else
    WinSetTitle($oGui, "", 'IE-Informer: Verbunden zu : " ' & _IEPropertyGet($oIE, "locationname") & ' "')
    EndIf ;==>_AttachStart
    _Search_All_Links($oIE)
    _Search_All_Inputs($oIE)
    EndFunc ;==>_AttachStart

    [/autoit] [autoit][/autoit] [autoit]

    Func _Search_All_Links($oObj)
    $oObjekts = $oObj.document.getElementsByTagName('A')
    For $oObjekt In $oObjekts
    $uID = GUICtrlCreateTreeViewItem($oObjekt.InnerHTML, $oGUI_List_Links)
    $iItems[$uID] = $oObjekt
    Next
    EndFunc ;==>_Search_All_Links

    [/autoit] [autoit][/autoit] [autoit]

    Func _Search_All_Inputs($oObj)
    $oObjekts = $oObj.document.getElementsByTagName('Input')
    For $oObjekt In $oObjekts
    $uID = GUICtrlCreateTreeViewItem($oObjekt.Name, $oGUI_List_Inputs)
    $iItems[$uID] = $oObjekt
    Next
    EndFunc ;==>_Search_All_Inputs

    [/autoit] [autoit][/autoit] [autoit]

    Func _ItemCheck()
    MsgBox(0, "Listview", "angeklickt=" & $iItems[GUICtrlRead($oGUI_List)].outerHTML)
    EndFunc ;==>_ItemCheck

    [/autoit] [autoit][/autoit] [autoit]

    Func _ItemMark()
    AdlibUnRegister("_ItemMark")
    _GDIPlus_Startup()
    If IsDeclared($hGraphic) Then _GDIPlus_GraphicsDispose($hGraphic)
    $id = GUICtrlRead($oGUI_List)
    $oObj = $iItems[$id]
    $iScreenX = _IEPropertyGet($oObj, "screenx")
    $iScreenY = _IEPropertyGet($oObj, "screeny")
    $iWidth = _IEPropertyGet($oObj, "width")
    $iHeight = _IEPropertyGet($oObj, "height")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($oIE)
    $hPen = _GDIPlus_PenCreate()
    _GDIPlus_PenSetColor($hPen, 0xFFFF0000)
    _GDIPlus_GraphicsDrawRect($hGraphic, $iScreenX, $iScreenY, $iWidth, $iHeight, $hPen)
    Do
    Sleep(100)
    _GDIPlus_GraphicsDrawRect($hGraphic, $iScreenX, $iScreenY, $iWidth, $iHeight, $hPen)
    Until not (GUICtrlRead($oGUI_List) = $id)
    _GDIPlus_Shutdown()
    AdlibRegister("_ItemMark", 100)
    EndFunc ;==>_ItemMark

    [/autoit]
  • ich glaube du musst das dispose von gdi hinten an die funktion hängen und nicht vorne

  • Ne leider klappte auch irgendwie nicht,hab alle möglichen versionen ausprobiert, muss da irgendnen ganz abartigen denkfehler haben

    ps. danke der erste der antwortet ^^

  • Das Problem ist nicht GDI+, sondern die Berechnung der Koodinate für das Rechteck. Natürlich kann man auch noch zusätzlich GDI+ optimieren, aber zunächst sollte die Berechnung klappen.

    Da ich so gut wie nie mit den IE.au3 gearbeitet habe, weiß ich nicht, wie man vernünftig die Position berechnet, denn bei mir wird das Rechteck irgendwo platziert.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das Rechteckt wird dort angezeigt wo auch das Obj ist, soweit hab ichs ja schon, nur das ich wenn ich das nächste rechteck will will ich das alte löschen und das klappt nicht

  • Bei mir wird das Rechteck irgendwo plaziert. Abgesehen davon, kann ich da mal schauen, ob ich die bei den GDI+ Sachen helfen kann!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯