- Offizieller Beitrag
Hi,
ich hatte es gestern schon mal kurz drin, wegen eines zu spät bemerkten Bugs aber wieder rausgenommen.
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
#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)
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
Global $ListView1
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
HotKeySet("!e", "_Ende")
HotKeySet("!s", "_ShowGUI")
HotKeySet("!c", "_CloseIE")
$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))
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
Func _Ende()
Exit
EndFunc
Func AForm1Close()
GUISetState(@SW_HIDE, $Form1)
EndFunc
Func _ShowGUI()
GUISetState(@SW_SHOW, $Form1)
EndFunc
Func _IfNews()
If (GUICtrlRead($cbOnlyNews) = 1) And (GUICtrlRead($cbIfNews) = 4) Then _
GUICtrlSetState($cbOnlyNews, $GUI_UNCHECKED)
EndFunc
Func _OnlyNews()
GUICtrlSetState($cbIfNews, $GUI_CHECKED)
EndFunc
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
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
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
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
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
Func _CloseIE()
_IEAction($oIEshowLast, "invisible")
EndFunc
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
;----------------------------------------------------------------------------------------------------------------------
; 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