• Offizieller Beitrag

    Hi,
    ich hatte es gestern schon mal kurz drin, wegen eines zu spät bemerkten Bugs aber wieder rausgenommen. :rolleyes:

    So, nun funzt es aber. Ähnlich, wie das Guckloch vom Browser. Aber mit der gesamten Liste der letzten Einträge und ohne sichtbares Browserfenster.
    Das Fenster mit der Tabelle wird nach jeder Aktualisierung (wenn vorher geschlossen) neu eingeblendet.
    Programmende mit <Alt+e>.

    Edit:

    Habe alle Anregungen übernommen. ;)
    - nach Programmstart wird die Tabelle mit den letzten 10 Einträgen gezeigt
    - per Checkbox wählbar:
    • nur einblenden, wenn Änderungen
    • nur Änderungen auflisten (bedingt automatisch den vorigen Punkt)

    - bei Anzeige der gesamten Liste, werden Änderungen zur letzten Abfrage farblich markiert
    - Aktualisierungsintervall kann über Inputfeld frei gewählt werden
    - mit Doppelklick auf Listeneintrag, wird dieser in einer zweiten IE-Objekt-Instanz aufgerufen; Aktualisierung läuft auf erster Instanz weiter
    - das IE-Fenster sollte zum Schließen per HotKey invisible gesetzt werden
    • beim Schließen des Fensters über Button oder Menü wird sonst auch das Objekt gelöscht
    • falls es doch passiert - kein Problem, Objekt wird neu erstellt (kostet nur etwas Zeit)

    - HotKeys:
    • 'Alt+c' IE-Fenster invisible setzen
    • 'Alt+s' GUI mit Liste in den Vordergrund holen
    • 'Alt+e' Programm beenden

    Edit: Sry, noch einen Bug gefunden. Einblenden nur bei Änderungen hatte noch nicht geklappt.

    Hab jetzt noch eine Version angehängt, in der der Beitrag im Standardbrowser geöffnet wird.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_outfile=AutoItNews
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #include <IE.au3>
    #include <file.au3>
    Opt("GUIOnEventMode", 1)
    AutoitSetOption("WinTitleMatchMode", 2)

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

    Global Const $WM_NOTIFY = 0x004E
    Global Const $NM_FIRST = 0
    Global Const $NM_DBLCLK = ($NM_FIRST - 3)
    Global $ListView1

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

    Dim $oIE = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
    Dim $oIEshowLast = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
    Dim $oTable, $oLinks, $IEtitle = 'AutoIt Forum - Deutsch'
    Dim $aTableData, $aOldData[1][1], $time = @HOUR & ':' & @MIN, $timeRefresh, $news = 1
    Dim $aLinks[10], $arItem[20], $arTmp[20][7], $titel = "Letzte Forenbeiträge "
    Dim $WhiteSmoke = 0xF5F5F5, $LightGray = 0xD3D3D3, $Coral = 0xFF7F50

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

    HotKeySet("!e", "_Ende")
    HotKeySet("!s", "_ShowGUI")
    HotKeySet("!c", "_CloseIE")

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

    $Form1 = GUICreate($titel & $time, 727, 367, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
    $ListView1 = GUICtrlCreateListView("Beitrag|Autor|Antworten/ Hits|Letzter", 16, 40, 694, 314)
    _GUICtrlListViewSetColumnWidth(-1,0,350)
    _GUICtrlListViewSetColumnWidth(-1,1,130)
    _GUICtrlListViewSetColumnWidth(-1,2,90)
    _GUICtrlListViewSetColumnWidth(-1,3,117)
    $cbIfNews = GUICtrlCreateCheckbox("Nur zeigen bei News", 16, 13, 130, 17)
    GUICtrlSetOnEvent(-1, "_IfNews")
    $cbOnlyNews = GUICtrlCreateCheckbox("Zeige nur News", 150, 13, 100, 17)
    GUICtrlSetOnEvent(-1, "_OnlyNews")
    GUICtrlCreateLabel("Aktualisierungs-Intervall in Sekunden:", 475, 13, 180, 17)
    $inTime = GUICtrlCreateInput(60, 660, 10, 50, 20, BitOR($ES_RIGHT, $ES_MULTILINE))

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

    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

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

    _show()
    $start = TimerInit()
    $begin = TimerInit()
    While 1
    If TimerDiff($begin) > $timeRefresh Then
    _IEAction($oIE, "refresh")
    _show()
    $begin = TimerInit()
    EndIf
    If TimerDiff($start) > 60000 Then
    $time = @HOUR & ':' & @MIN
    WinSetTitle($Form1, "", $titel & $time)
    $start = TimerInit()
    EndIf
    WEnd

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

    Func _Ende()
    Exit
    EndFunc

    Func AForm1Close()
    GUISetState(@SW_HIDE, $Form1)
    EndFunc

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

    Func _ShowGUI()
    GUISetState(@SW_SHOW, $Form1)
    EndFunc

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

    Func _IfNews()
    If (GUICtrlRead($cbOnlyNews) = 1) And (GUICtrlRead($cbIfNews) = 4) Then _
    GUICtrlSetState($cbOnlyNews, $GUI_UNCHECKED)
    EndFunc

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

    Func _OnlyNews()
    GUICtrlSetState($cbIfNews, $GUI_CHECKED)
    EndFunc

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

    Func _show()
    If _readData() = -1 Then
    _GUICtrlListViewDeleteAllItems($ListView1)
    _setData()
    $timeRefresh = GUICtrlRead($inTime)*1000
    If GUICtrlRead($cbIfNews) = 1 Then
    If $news > 0 Then GUISetState(@SW_SHOW, $Form1)
    Else
    GUISetState(@SW_SHOW, $Form1)
    EndIf
    EndIf
    EndFunc

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

    Func _readData()
    $news = 0
    $oLinks = _IELinkGetCollection ($oIE)
    _getLinks()
    $oTable = _IETableGetCollection ($oIE,17)
    $aTableData = _IETableWriteToArray ($oTable)
    If @error Then Return 0
    If UBound($aOldData) > 1 Then
    For $i = 1 To 10
    For $k = 1 To 10
    If $aOldData[2][$k] = $aTableData[2][$i] Then
    If $aOldData[6][$k] <> $aTableData[6][$i] Then
    $aTableData[0][$i] = 1 ; geänderter Eintrag
    $news += 1
    ExitLoop
    Else
    $aTableData[0][$i] = 2 ; unverändert
    EndIf
    EndIf
    Next
    Next
    For $i = 1 To 10
    If ($aTableData[0][$i] <> 1) Then
    If ($aTableData[0][$i] <> 2) Then
    $aTableData[0][$i] = 1 ; neuer Eintrag
    $news += 1
    EndIf
    EndIf
    Next
    EndIf
    $aOldData = $aTableData
    For $i = 1 To 10
    $aOldData[0][$i] = 0
    Next
    _Array2DMirror($aTableData)
    ReDim $arTmp[UBound($aTableData)-2][UBound($aTableData,2)]
    For $i = 1 To UBound($aTableData) -2
    For $k = 0 To UBound($aTableData,2)-1
    $arTmp[$i-1][$k] = $aTableData[$i][$k]
    Next
    Next
    $aTableData = $arTmp
    ReDim $arTmp[20][7]
    For $x = 1 To 6
    $k = 1
    If ($x = 2) Or ($x = 4) Or ($x = 6) Then
    For $i = 0 To 9
    $var = StringSplit($aTableData[$i][$x], @CRLF)
    $arTmp[$k-1][$x] = $var[1]
    $arTmp[$k][$x] = $var[3]
    $k += 2
    Next
    Else
    For $i = 0 To 9
    $arTmp[$k-1][$x] = $aTableData[$i][$x]
    $k += 2
    Next
    EndIf
    Next
    For $i = 0 To 18 Step 2
    $arTmp[$i+1][0] = $arTmp[$i][0]
    Next
    For $i = 0 To 9
    $k = 2*$i
    $arTmp[$k][1] = $aLinks[$i]
    $arTmp[$k+1][1] = $aLinks[$i]
    $arTmp[$k][0] = $aTableData[$i][0]
    $arTmp[$k+1][0] = $aTableData[$i][0]
    Next
    $aTableData = $arTmp
    Return -1
    EndFunc

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

    Func _getLinks()
    Local $i = 0, $k = 0
    ReDim $aLinks[10]
    For $oLink In $oLinks
    If StringInStr($oLink.href, '?goto=lastpost&threadid=',1) Then
    $aLinks[$i] = $k ; LinkIndex
    $i += 1
    EndIf
    $k += 1
    Next
    EndFunc

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

    Func _setData()
    Local $k = 0, $n = 0
    Select
    Case GUICtrlRead($cbOnlyNews) = 4
    ReDim $arItem[20]
    ReDim $aLinks[20]
    For $i = 0 To 19
    $k += 1
    If Mod($i, 2) = 0 Then
    $arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&$aTableData[$i][3]& _
    ' / '&$aTableData[$i][5]&'|'&$aTableData[$i][6], $ListView1)
    Else
    $arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&'|'&$aTableData[$i][6], $ListView1)
    EndIf
    If ($k = 1) Or ($k = 2) Then
    If ($aTableData[$i][0] = 1) And (Mod($k, 2) <> 0) Then
    GUICtrlSetBkColor($arItem[$i], $Coral)
    Else
    GUICtrlSetBkColor($arItem[$i], $WhiteSmoke)
    EndIf
    Else
    If $aTableData[$i][0] = 1 Then
    GUICtrlSetBkColor($arItem[$i], $Coral)
    Else
    GUICtrlSetBkColor($arItem[$i], $LightGray)
    EndIf
    EndIf
    If $k = 4 Then $k = 0
    $aLinks[$i] = $aTableData[$i][1]
    Next
    Case (GUICtrlRead($cbOnlyNews) = 1) And ($news > 0)
    ReDim $arItem[2*$news]
    ReDim $aLinks[2*$news]
    For $i = 0 To 19
    $k += 1
    If $aTableData[$i][0] = 1 Then
    If Mod($i, 2) = 0 Then
    $arItem[UBound($arItem)-1] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&$aTableData[$i][3]& _
    ' / '&$aTableData[$i][5]&'|'&$aTableData[$i][6], $ListView1)
    Else
    $arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&'|'&$aTableData[$i][6], $ListView1)
    EndIf
    If ($k = 1) Or ($k = 2) Then
    GUICtrlSetBkColor($arItem[$i], $WhiteSmoke)
    Else
    GUICtrlSetBkColor($arItem[$i], $LightGray)
    EndIf
    If $k = 4 Then $k = 0
    $aLinks[$n] = $aTableData[$i][1]
    $n += 1
    EndIf
    Next
    EndSelect
    EndFunc

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

    Func ListView_DoubleClick()
    $index = _GUICtrlListViewGetCurSel($ListView1)
    _IENavigate($oIEshowLast, "http://www.autoit.de/portal.php")
    If @error Then $oIEshowLast = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
    _IELinkClickByIndex($oIEshowLast, $aLinks[$index])
    _IEAction($oIEshowLast, "visible")
    WinSetState($IEtitle, '', @SW_MAXIMIZE)
    EndFunc

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

    Func _CloseIE()
    _IEAction($oIEshowLast, "invisible")
    EndFunc

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

    Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    Case $wParam = $ListView1
    Select
    Case $event = $NM_DBLCLK
    ListView_DoubleClick ()
    EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>WM_Notify_Events

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DMirror(ByRef $ARRAY)
    ;
    ; Description to mirror columns with rows in an 2D Array
    ;
    ; Parameter $ARRAY: 2D Array
    ;
    ; Return Succes -1 ByRef mirrored Array
    ; Failure 0 set @error
    ; @error = 1 given array is not array
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DMirror(ByRef $ARRAY)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    SetError(2)
    Return 0
    EndIf
    Local $arTMP[$UBound2nd][UBound($ARRAY)]
    For $i = 0 To UBound($ARRAY) -1
    For $k = 0 To UBound($ARRAY,2) -1
    $arTMP[$k][$i] = $ARRAY[$i][$k]
    Next
    Next
    $ARRAY = $arTMP
    Return -1
    EndFunc ;==>_Array2DMirror

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    eine Idee hätte ich noch, vllt. kannst Du noch einbauen das das Fenster erst wieder eingeblendet wird wenn es einen neuen Beitrag gibt, evtl. mit Checkbox zum ein-/ausschalten!

  • Man sollte direkt zu dem Link kommen, wenn man nen doppelklick drauf macht. Dann würde ich das Tool sofort nutzen :D

    • Offizieller Beitrag

    Hallo,

    weil mich das ständige klicken beim refresh der Shoutbox im IE stört habe ich bei mir 2 Zeilen von Guckloch_Def_Browser.au3 geändert.

    Zeile 18:

    [autoit]

    Dim $oIE = _IECreate("http://www.autoit.de/jgs_portal_box.php?id=18&sid=",0,0,1,-1)

    [/autoit]

    Zeile 97:

    [autoit]

    $oTable = _IETableGetCollection ($oIE,5)

    [/autoit]

    Dadurch wird nicht mehr die Portal-Seite aufgerufen sonder direkt die Seite "letzte Beiträge".

    @1:
    In die _Ende-Funktion sollte man noch ein _IEQuit($oIE) vor das Exit schreiben, damit der IE auch beendet wird und ein Sleep in der While schleife würde den Prozessor etwas entlasten.

  • Kann einer mir mal sagen wieso immer dieser Fehler kommt:

    Code
    --> IE.au3 Warning from function _IECreate (Foreground Window Unlock Failed!)
    --> IE.au3 Warning from function _IETableGetCollection, $_IEStatus_NoMatch
    --> IE.au3 Error from function _IETableWriteToArray, $_IEStatus_InvalidDataType
    --> IE.au3 Warning from function _IETableGetCollection, $_IEStatus_NoMatch


    und der kommt die ganze Zeit bis das Script beendet wird, aber wieso?

  • Zitat

    Original von BugFix
    Ich kann diesen Fehler nicht reproduzieren. Also gehe ich mal von aus, dass er in deinem System liegt. Evtl. IE7 ? - Wäre 'ne mögliche Fehlerquelle, da geht ab und an was schief, aber ob das nun diese Fehler verursachen kann weiß ich nicht.


    Also ich habe den IE7 drauf... also liegt das warscheinlich an den IE7.
    :(