Klar geht das, aber warum nicht gleich an der Ursache des Problems ansetzen...
Beiträge von K4z
-
-
Das ist so gewollt. Schreib dir die Funktion doch einfach um:
Spoiler anzeigen
[autoit]Func _FileWriteFromArray2($File, $a_Array, $i_Base = 0, $i_UBound = 0, $s_Delim = "|")
[/autoit] [autoit][/autoit] [autoit]
; Check if we have a valid array as input
If Not IsArray($a_Array) Then Return SetError(2, 0, 0)
Local $iDims = UBound($a_Array, 0)
If $iDims > 2 Then Return SetError(4, 0, 0); determine last entry
[/autoit] [autoit][/autoit] [autoit]
Local $last = UBound($a_Array) - 1
If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
If $i_Base < 0 Or $i_Base > $last Then $i_Base = 0; Open output file for overwrite by default, or use input file handle if passed
[/autoit] [autoit][/autoit] [autoit]
Local $hFile
If IsString($File) Then
$hFile = FileOpen($File, $FO_OVERWRITE)
Else
$hFile = $File
EndIf
If $hFile = -1 Then Return SetError(1, 0, 0); Write array data to file
[/autoit] [autoit][/autoit] [autoit]
Local $ErrorSav = 0
Switch $iDims
Case 1
For $x = $i_Base To $i_UBound
If FileWrite($hFile, $a_Array[$x]) = 0 Then
$ErrorSav = 3
ExitLoop
EndIf
Next
Case 2
Local $s_Temp
For $x = $i_Base To $i_UBound
$s_Temp = $a_Array[$x][0]
For $y = 1 To $iDims
$s_Temp &= $s_Delim & $a_Array[$x][$y]
Next
If FileWrite($hFile, $s_Temp) = 0 Then
$ErrorSav = 3
ExitLoop
EndIf
Next
EndSwitch; Close file only if specified by a string path
[/autoit] [autoit][/autoit] [autoit]
If IsString($File) Then FileClose($hFile); Return results
[/autoit]
If $ErrorSav Then Return SetError($ErrorSav, 0, 0)
Return 1
EndFunc ;==>_FileWriteFromArray -
Hmm irgendwie kann ich mich nich klar ausdrücken...

Also wenn du ein stink normales Echo-Programm hast wie ",[.,]", dann wird bei jedem "," solange die Zeichenkette abgearbeitet, bis sie zuende ist und erneut ein Input gemacht werden kann. Wenn du dann zum Beispiel "Hallo Welt" eingibst, dann wird das auch so nach und nach ausgegeben.
Das macht dann zum Beispiel einfache StringFunktionen möglich. Ich hoff ich konnte mich bisschen deutlicher ausdrücken... -
-
Eigentlich meinte ich einen String als Input. Dass man, statt nur einzelne ASCII-Zeichen einen ganzen String eingeben kann, so wie das bei Brainfuck Developer der Fall ist...
-
-
Respekt, richtig geil!
Mit ":" und ";" kannte ich das bisher noch nicht. Echt gute Idee, die Konvertierung ist ja alles andere als simpel...
Was das ganze noch bisschen besser machen würde, wäre wenn man ein File in das Fenster hineinziehn könnte und es dann geöffnet wird, ist ja sehr einfach.
Keep up the good work!EDIT: Ich bin von anderen Brainfuck-Interpreter gewohnt einen ganzen String einzugeben, wobei dann jedes Zeichen einzeln abgearbeitet wird. Das wäre vielleicht auch noch ganz schön:)
-
-
Ich hab mal vor einiger zeit ein HLSW ähnliches Tool geschrieben und ich hab mir jetzt gedacht, dass sich daraus relativ leicht eine UDF schreiben lässt.
Die UDF enthält folgende Befehle:
- _SourceConnect()
Verbindet sich mit einem SourceServer- _SourceGetChallenge()
Gibt eine challenge number zurück, die für _SourceGetPlayers() und _SourceGetRules() benötigt wird- _SourceGetInfo(), _SourceGetPlayers(), _SourceGetRules()
Geben jeweils ein Array zurück, das nur mit Hilfe dieser Seite verstanden werden kann:- _SourceClose()
Schließt die offene VerbindungGetestet habe ich bisher nur Counterstrike Source Server, aber es sollten prinzipiell alle SourceGames gehen.
Falls hier überhaupt Leute unterwegs sein sollten, die so etwas interessiert, würd ich mich über Feedback freuen!
UDF:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Const $S2C_CHALLENGE = Binary("0xFFFFFFFF56FFFFFFFF")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Const $A2S_RULES = Binary("0xFFFFFFFF56")
Const $A2S_PLAYER = Binary("0xFFFFFFFF55")
Const $A2S_INFO = Binary("0xFFFFFFFF54536F7572636520456E67696E6520517565727900")
Global $g_PING = 0, $socket; ////////////////////// Functions \\\\\\\\\\\\\\\\\\\\\\
[/autoit] [autoit][/autoit] [autoit]
; ===================\
;_SourceConnect
;_SourceGetChallenge
;_SourceGetInfo
;_SourceGetPlayers
;_SourceGetRules
;_SourceClose
;
;__SourceReceiveData
;__SourceBinaryToArray
; ===================/; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _SourceConnect
; Description ...: Baut ein Verbindung zum Server auf
; Syntax ........: _SourceConnect($sIP)
; Parameters ....: $sIP - A string value.
; Return values .: Socket
; ===============================================================================================================================
Func _SourceConnect($sIP)
UDPStartup()
$aIP = StringRegExp($sIP, "([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\:([0-9]{1,6})", 3)
If Not IsArray($aIP) Then
MsgBox(4112, "Error", "Keine gültige Ip-Addresse!")
Return
EndIf
Local $socket = UDPOpen($aIP[0], $aIP[1])
If @error Then
MsgBox(4112, "Error", "UDPOpen failed with WSA error: " & @error)
Exit
EndIf
Return $socket
EndFunc ;==>_SourceConnect; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _SourceGetChallenge
; Description ...: Empfängt die Challenge Number
; Syntax ........: _SourceGetChallenge($socket[, $iTimeOut = 2000])
; Parameters ....: $socket - A string value.
; $iTimeOut - [optional] An integer value. Default is 2000.
; Return values .: On Success - Returns Binary
; Timeout - -1
; ===============================================================================================================================
Func _SourceGetChallenge($socket, $iTimeOut = 2000)
Local $timer = TimerInit()
UDPSend($socket, $S2C_CHALLENGE)
Do
Local $data = Binary(UDPRecv($socket, 50))
If $data <> "" And BinaryLen($data) = 9 Then Return BinaryMid($data, 6)
Sleep(10)
Until TimerDiff($timer) > $iTimeOut
Return -1
EndFunc ;==>_SourceGetChallenge; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _SourceGetInfo
; Description ...: Empfängt die Serverinfo
; Syntax ........: _SourceGetInfo($socket)
; Parameters ....: $socket - A string value.
; Return values .: Array
Func _SourceGetInfo($socket)
UDPSend($socket, $A2S_INFO)
Return __SourceBinaryToArray(__SourceReceiveData($socket), 'nnnhhssssiniiicchhs')
EndFunc ;==>_SourceGetInfo; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _SourceGetPlayers
; Description ...: Empfängt die Spielerdaten
; Syntax ........: _SourceGetPlayers($socket, $bChallenge)
; Parameters ....: $socket - A string value.
; $bChallenge - A binary value.
; Return values .: Array
; ===============================================================================================================================
Func _SourceGetPlayers($socket, $bChallenge)
UDPSend($socket, $A2S_PLAYER + $bChallenge)
Local $sRecv = __SourceReceiveData($socket)
Local $iCount = Int(BinaryMid($sRecv, 6, 1))
If $iCount = 0 Then Return 0
Local $sPattern = "nnnnn"
For $iI = 1 To $iCount
$sPattern &= "nslf"
Next
Return __SourceBinaryToArray($sRecv, $sPattern)
EndFunc ;==>_SourceGetPlayers; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _SourceGetRules
; Description ...: Empfängt die Server Rules
; Syntax ........: _SourceGetRules($socket, $bChallenge)
; Parameters ....: $socket - A string value.
; $bChallenge - A binary value.
; Return values .: Array
; ===============================================================================================================================
Func _SourceGetRules($socket, $bChallenge)
UDPSend($socket, $A2S_RULES + $bChallenge)
Local $iCount, $sPattern
Local $sRecv = __SourceReceiveData($socket)
If StringLeft($sRecv, 4) = "0xFE" Then
$iCount = Int(BinaryMid($sRecv, 18, 1))
$sPattern = "nnnnnnnnnnnnnnnnnn"
Else
$iCount = Int(BinaryMid($sRecv, 6, 1))
$sPattern = "nn"
EndIf
For $iI = 1 To $iCount
$sPattern &= "ss"
Next
Return __SourceBinaryToArray($sRecv, $sPattern)
EndFunc ;==>_SourceGetRules; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: __SourceReceiveData
; Description ...: Empfängt ein oder mehrere Pakete und gibt diese als String aus
; Syntax ........: __SourceReceiveData($socket[, $iTimeOut = 2000])
; Parameters ....: $socket - A string value.
; $iTimeOut - [optional] An integer value. Default is 2000.
; Return values .: On Success - Returns String
; Timeout - -1
; ===============================================================================================================================
Func __SourceReceiveData($socket, $iTimeOut = 2000)
Local $timer = TimerInit()
Do
Local $sString = Binary(UDPRecv($socket, 2048))
If $sString <> '' Then
$g_PING = Round(TimerDiff($timer), 2) & " ms"
If BinaryMid($sString, 1, 4) = "0xFEFFFFFF" Then ; Falls das Paket in mehrere Parts gesplittet ist
Local $iPacketCount = Int(BinaryMid($sString, 9, 1))
For $iCurrentPacket = 1 To $iPacketCount ; Alle Pakete zusammenfügen
$sChunk = UDPRecv($socket, 2048)
If $sChunk <> '' Then $sString &= BinaryMid(Binary($sChunk), 0xD)
If TimerDiff($timer) > $iTimeOut Then Return -1
Next
Return $sString
Else
Return $sString
EndIf
EndIf
Sleep(10)
Until TimerDiff($timer) > $iTimeOut
Return -1
EndFunc ;==>__SourceReceiveData; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: __SourceBinaryToArray
; Description ...: Splittet einen BinaryString nach einem bestimmten Pattern
; Syntax ........: __SourceBinaryToArray($sString, $sPattern)
; Parameters ....: $sString - A string value.
; $sPattern - Zeichenfolge
; i = 1 Byte als Ganzzahl
; h = 1 Byte in Hexschreibweise
; c = 1 Byte als Char
; l = long (32bit signed BigEndian)
; f = float (32bit BigEndian)
; s = Null-terminated String
; n = Null Byte (ein Byte überspringen)
; Return values .: None
; Author ........: Your Name
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func __SourceBinaryToArray($sString, $sPattern)
Local $iByte = 3, $aBytes = StringSplit(StringTrimLeft($sString, 2), ""), $aPattern = StringSplit($sPattern, ""), $aResult[1]
For $iType = 1 To $aPattern[0]
Switch $aPattern[$iType]
Case "i"
_ArrayAdd($aResult, Int("0x" & $aBytes[$iByte] & $aBytes[$iByte + 1]))
$iByte += 2
Case "h"
_ArrayAdd($aResult, "0x" & $aBytes[$iByte] & $aBytes[$iByte + 1])
$iByte += 2
Case "c"
_ArrayAdd($aResult, Chr("0x" & $aBytes[$iByte] & $aBytes[$iByte + 1]))
$iByte += 2
Case "l"
Local $iLong = 0
For $iI = 6 To 0 Step -2
$iLong &= $aBytes[$iByte + $iI] & $aBytes[$iByte + $iI + 1]
Next
_ArrayAdd($aResult, Dec($iLong))
$iByte += 8
Case "f"
Local $iFloat = ""
For $iI = 6 To 0 Step -2
$iFloat &= $aBytes[$iByte + $iI] & $aBytes[$iByte + $iI + 1]
Next
Local $tInt = DllStructCreate("int")
Local $tFloat = DllStructCreate("float", DllStructGetPtr($tInt))
DllStructSetData($tInt, 1, Dec($iFloat))
_ArrayAdd($aResult, DllStructGetData($tFloat, 1))
$iByte += 8
Case "s"
Local $sChunk = "0x"
Local $sCurrentChar = $aBytes[$iByte] & $aBytes[$iByte + 1]
While $sCurrentChar <> "00"
$sChunk &= $sCurrentChar
$iByte += 2
$sCurrentChar = $aBytes[$iByte] & $aBytes[$iByte + 1]
WEnd
_ArrayAdd($aResult, BinaryToString($sChunk, 4))
$iByte += 2
Case "n"
$iByte += 2
EndSwitch
Next
$aResult[0] = UBound($aResult) - 1
Return $aResult
EndFunc ;==>__SourceBinaryToArray; #FUNCTION# ====================================================================================================================
[/autoit]
; Name ..........: _SourceClose
; Description ...: Schließt die offene UDP-Verbindung
; Syntax ........: _SourceClose()
; ===============================================================================================================================
Func _SourceClose($socket)
UDPCloseSocket($socket)
UDPShutdown()
EndFunc ;==>_SourceCloseTestscript:
Spoiler anzeigen
[autoit]#include "steam.au3"
[/autoit] [autoit][/autoit] [autoit]$socket = _SourceConnect("77.111.213.213:27015")
[/autoit]
$bChallenge = _SourceGetChallenge($socket)
$aInfo = _SourceGetInfo($socket)
$aRules = _SourceGetRules($socket, $bChallenge)
$aPlayers = _SourceGetPlayers($socket, $bChallenge)
_ArrayDisplay($aInfo)
_ArrayDisplay($aRules)
_ArrayDisplay($aPlayers)
MsgBox(0, "", $g_PING)
_SourceClose($socket)K4z
-
Ich frag mich was alle gegen reguläre Ausdrücke haben...
Das Beispiel zeigt doch sehr gut, dass sie nicht ganz so sinnlos sind. -
So ist es ein bisschen kürzer:
[autoit]$ID = "W442525"
[/autoit]
If StringRegExp($ID, "^[^WHSZMKFCE]") Then
MsgBox(0, "D.3-ID Agent", "Es handelt sich um keine gültige Identnummer.")
$Fehler = 1
Return
EndIf
Auf deine Art müsste es so gehn:Spoiler anzeigen
[autoit]$ID = "A442525"
[/autoit]
If Not (StringLeft($ID, 1) = "W" OR StringLeft($ID, 1) = "H" OR StringLeft($ID, 1) = "S" OR StringLeft($ID, 1) = "Z" OR StringLeft($ID, 1) = "M" OR StringLeft($ID, 1) = "K" OR StringLeft($ID, 1) = "F" OR StringLeft($ID, 1) = "C" OR StringLeft($ID, 1) = "E") Then
MsgBox(0, "D.3-ID Agent", "Es handelt sich um keine gültige Identnummer.")
$Fehler = 1
Return
EndIf -
Hier noch ein kleines Beispiel:
Testfenster compilieren und ausführen:Spoiler anzeigen
[autoit]GUICreate("TestFenster", 140, 55, 308, 334)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateButton("Button", 32, 15, 75, 25)
GUISetState(@SW_SHOW)While Sleep(100)
[/autoit]
If GUIGetMsg() = -3 Then Exit
WEndFolgender Code macht aus dem Button ein Radiobutton:
Spoiler anzeigen
[autoit]#include <SendMessage.au3>
[/autoit] [autoit][/autoit] [autoit]$BM_SETSTYLE = 0x00F4
[/autoit] [autoit][/autoit] [autoit]
$BS_RADIOBUTTON = 0x00000004$hWnd = ControlGetHandle("TestFenster", "", 3)
[/autoit]
_SendMessageA($hWnd, $BM_SETSTYLE, $BS_RADIOBUTTON, 1)Eigentlich könnte man hier mal ein SendMessage Tutorial schreiben...
-
Ich hab jetzt einfach mal ein kleines Beispiel geschrieben, das den Fensternamen vom Editor umändert. Jeder Message ist eine bestimmte Zahl zugeordnet.
Zum Beispiel WM_SETTEXT = 0x000C. Du musst bei jeder Message schauen, wie du sie verwenden musst (wParam, lParam).
SETTEXT ist hier beschrieben.Spoiler anzeigen
[autoit]#include <SendMessage.au3>
[/autoit] [autoit][/autoit] [autoit]$WM_SETTEXT = 0x000C
[/autoit] [autoit][/autoit] [autoit]Run("notepad.exe")
[/autoit] [autoit][/autoit] [autoit]
WinWaitActive("Unbenannt - Editor")$hWnd = WinGetHandle("Unbenannt - Editor")
[/autoit]
$tStruct = DllStructCreate("char[128]")
DllStructSetData($tStruct, 1, "TestTestTest")
_SendMessageA($hWnd, $WM_SETTEXT, 0, DllStructGetPtr($tStruct, 1)) -
Ich hab einfach ma bissle rumgeschaut, was es auf deutsch gibt:
"SendMesasge sendet eine Nachricht an ein anderes Fenster und wartet auf eine Antwort. Die Nachricht umgeht die Nachrichtenwarteschlange und wird unmittelbar verarbeitet."
"Sendet eine Nachricht an ein Fenster oder Steuerelement (SendMessage wartet zusätzlich auf eine Bestätigung). Diese Befehle sollten mit Vorsicht verwendet werden, da das Senden einer Nachricht an das falsche Fenster (oder das Senden einer ungültigen Nachricht) zu unerwartetem Verhalten oder sogar zum Absturz der Zielanwendung führen könnte. Denn die meisten Anwendungen sind nicht dafür entworfen, um bestimmte Arten von Nachrichten aus externen Quellen zu erwarten."
"Mit der Funktion SendMessage können Nachrichten an darstellbare Elemente einer Anwendung gesandt werden. "
-
Hier steht doch alles Wichtige. Die Funktion gibt es in 3 verschiedenen Ausführungen SendMessage, SendMessageA und SendMessageW. Dabei steht das A dafür, dass der ascii Zeichensatz verwendet wird und W für Unicode. Hier gibt es noch mehr Erklärung und dort sind auch alle Messages aufgelistet.
EDIT:
Zitatkann sogut wie kein Englisch
Das hab ich wohl übersehn...
-
Mit regulären Ausdrücken....
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]
$sString = "Mein strin - Betreff - 002 - alles okay" & @CRLF & _
"Mein strin - Betreff - 005 - alles okay" & @CRLF & _
"Mein strin - Betreff - 306 - alles okay"$aRegexp = StringRegExp($sString, "Mein strin - Betreff - (\d{3}) - alles okay", 3)
[/autoit]
_ArrayDisplay($aRegexp) -
Irgendwie sieht es so aus als hätt sich da jemand verschrieben...
So geht's:Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
global $array[2][6]
$array[0][0] = "Hannes"
$array[0][1] = "Holger"
$array[0][2] = "Jon"
$array[0][3] = "Maik"
$array[0][4] = "mr.nobody"
$array[0][5] = "stefan"
$array[1][0] = "spielen"
$array[1][1] = "schreiben"
$array[1][2] = "gammeln"
$array[1][3] = "schlafen"
$array[1][4] = "ruhen"
$array[1][5] = "rennen"
_arrayDisplay($array)
$answer = _FileWriteFromArrayFixed(@DesktopDir& "\dummy.txt" , $array,0,0)Func _FileWriteFromArrayFixed($File, $a_Array, $i_Base = 0, $i_UBound = 0, $s_Delim = "|")
[/autoit] [autoit][/autoit] [autoit]
; Check if we have a valid array as input
If Not IsArray($a_Array) Then Return SetError(2, 0, 0)
Local $iDims = UBound($a_Array, 0)
If $iDims > 2 Then Return SetError(4, 0, 0); determine last entry
[/autoit] [autoit][/autoit] [autoit]
Local $last = UBound($a_Array) - 1
If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
If $i_Base < 0 Or $i_Base > $last Then $i_Base = 0; Open output file for overwrite by default, or use input file handle if passed
[/autoit] [autoit][/autoit] [autoit]
Local $hFile
If IsString($File) Then
$hFile = FileOpen($File, $FO_OVERWRITE)
Else
$hFile = $File
EndIf
If $hFile = -1 Then Return SetError(1, 0, 0); Write array data to file
[/autoit] [autoit][/autoit] [autoit]
Local $ErrorSav = 0
Switch $iDims
Case 1
For $x = $i_Base To $i_UBound
If FileWrite($hFile, $a_Array[$x] & @CRLF) = 0 Then
$ErrorSav = 3
ExitLoop
EndIf
Next
Case 2
Local $s_Temp
For $x = $i_Base To $i_UBound
$s_Temp = $a_Array[$x][0]
For $y = 1 To UBound($a_Array, 2)-1 ; <---- $iDims ist hier immer 2, also wohl ein Programmierfehler...
$s_Temp &= $s_Delim & $a_Array[$x][$y]
Next
If FileWrite($hFile, $s_Temp & @CRLF) = 0 Then
$ErrorSav = 3
ExitLoop
EndIf
Next
EndSwitch; Close file only if specified by a string path
[/autoit] [autoit][/autoit] [autoit]
If IsString($File) Then FileClose($hFile); Return results
[/autoit]
If $ErrorSav Then Return SetError($ErrorSav, 0, 0)
Return 1
EndFunc ;==>_FileWriteFromArray -
Ich verwende eigentlich Call() nur wenn ich keinen festen Funktionsnamen hab.
vlt ein kleines Beispiel:Spoiler anzeigen
[autoit]$iI = 2
[/autoit] [autoit][/autoit] [autoit]
Call("_Func" & $iI)Func _Func1()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "", "_Func1 wurde aufgerufen!")
EndFuncFunc _Func2()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "", "_Func2 wurde aufgerufen!")
EndFuncFunc _Func3()
[/autoit]
MsgBox(0, "", "_Func3 wurde aufgerufen!")
EndFuncMir ist nicht bekannt, dass das mit einem normalen Aufruf möglich ist, ich kann mich aber auch irren...
-
du musst in Zeile 26 statt der 0 ein "" verwenden
-
So vielleicht?:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 112, 116, 192, 124)
$Label1 = GUICtrlCreateLabel("Klick", 32, 32, 44, 17)
$Label2 = GUICtrlCreateLabel("Klick", 32, 64, 44, 17)
GUISetState(@SW_SHOW)Global $iCounter1 = 5, $iCounter2 = 5
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Label1
AdlibRegister("deine_counter_1", 1000)
Case $Label2
AdlibRegister("deine_counter_2", 1000)
EndSwitch
WEndFunc deine_counter_1()
[/autoit] [autoit][/autoit] [autoit]
If $iCounter1 >= 0 Then
GUICtrlSetData($Label1, $iCounter1)
$iCounter1 -= 1
Else
AdlibUnRegister("deine_counter_1")
EndIf
EndFuncFunc deine_counter_2()
[/autoit]
If $iCounter2 >= 0 Then
GUICtrlSetData($Label2, $iCounter2)
$iCounter2 -= 1
Else
AdlibUnRegister("deine_counter_2")
EndIf
EndFunc -
und das ist das limit von einem signed 16bit integer...
[ gelöst ] Up-/Down-Control bei Input -
Weil mir grad eh stink langweilig is, hier ma ein Ansatz mit ner riesigen RegExp
:Spoiler anzeigen
[autoit]#include <Inet.au3>
[/autoit]
#include <String.au3>
#include <Array.au3>
$sSource = _INetGetSource('http://tellkampf1.dyndns.org/Vertretungsplan_SuS/23/w/w00021.htm')
$sPattern = '<tr class=''list (?:odd|even)''><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)</td>' & _
'<td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)</td><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)' & _
'</td><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)</td><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)' & _
'</td><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)</td><td class="list" align="center" style="background-color: #(?:FF8080|80FF80)" >(.+?)</td></tr>'
$aRegExp = StringRegExp($sSource, $sPattern, 3)
Dim $aResult[Int(UBound($aRegExp)/7)][7]
For $iI = 0 To UBound($aResult)-1
For $iJ = 0 To 6
$aResult[$iI][$iJ] = $aRegExp[$iI*7+$iJ]
Next
Next
_ArrayDisplay($aResult) -
Du könntest die API Funktionen hooken, das würd ich aber niemals mit AutoIt machen...
Viel einfacher geht's mit ReadDirectoryChangesW. Schau dir dazu einfach mal folgendes Beispiel an:Spoiler anzeigen
[autoit]#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.2.10.0
[/autoit] [autoit][/autoit] [autoit]
Author: zorphnog (M. Mims)Script Function:
[/autoit] [autoit][/autoit] [autoit]
Monitors the user defined directories for file activity.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#include <Constants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <Date.au3>
#include <GUIConstants.au3>
#include <GuiListBox.au3>
#include <GuiListView.au3>Global Const _
[/autoit] [autoit][/autoit] [autoit]
$FILE_FLAG_BACKUP_SEMANTICS = 0x02000000, _
$FILE_FLAG_OVERLAPPED = 0x40000000
Global Const _
$FILE_NOTIFY_CHANGE_ALL = 0x17F, _
$FILE_NOTIFY_CHANGE_FILE_NAME = 0x001, _
$FILE_NOTIFY_CHANGE_DIR_NAME = 0x002, _
$FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004, _
$FILE_NOTIFY_CHANGE_SIZE = 0x008, _
$FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010, _
$FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020, _
$FILE_NOTIFY_CHANGE_CREATION = 0x040, _
$FILE_NOTIFY_CHANGE_SECURITY = 0x100
Global Const _
$FILE_ACTION_ADDED = 0x1, _
$FILE_ACTION_REMOVED = 0x2, _
$FILE_ACTION_MODIFIED = 0x3, _
$FILE_ACTION_RENAMED_OLD_NAME = 0x4, _
$FILE_ACTION_RENAMED_NEW_NAME = 0x5
Global Const _
$MWMO_ALERTABLE = 0x0002, _
$MWMO_INPUTAVAILABLE = 0x0004, _
$MWMO_WAITALL = 0x0001
Global Const $FILE_LIST_DIRECTORY = 0x0001
Global Const $QS_ALLINPUT = 0x04FF
Global Const $INFINITE = 0xFFFF
Global Const $tagFNIIncomplete = "dword NextEntryOffset;dword Action;dword FileNameLength"
Global $bMonitorDone, $bSelected, $bMonitor
AutoItSetOption("GUIOnEventMode", 1)$gFileMon = GUICreate("Directory Monitor", 731, 385, 194, 126)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "_OnEvent_Close")
GUICtrlCreateGroup("Monitored Directories", 8, 0, 713, 105)
$btAdd = GUICtrlCreateButton("Add", 16, 24, 75, 25, 0)
GUICtrlSetOnEvent(-1, "_OnEvent_Add")
$btRemove = GUICtrlCreateButton("Remove", 16, 56, 75, 25, 0)
GUICtrlSetOnEvent(-1, "_OnEvent_Remove")
GUICtrlSetState(-1, $GUI_DISABLE)
$lbDirectories = GUICtrlCreateList("", 104, 16, 506, 71)
$btMonitor = GUICtrlCreateButton("Start Monitor", 632, 24, 75, 25, 0)
GUICtrlSetOnEvent(-1, "_OnEvent_Monitor")
GUICtrlSetState(-1, $GUI_DISABLE)
$btClear = GUICtrlCreateButton("Clear", 632, 56, 75, 25, 0)
GUICtrlSetOnEvent(-1, "_OnEvent_Clear")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$lvNotifications = GUICtrlCreateListView("Action|Time|File", 8, 112, 714, 262)
GUICtrlSendMsg(-1, 0x101E, 0, Int(.1*710))
GUICtrlSendMsg(-1, 0x101E, 1, Int(.2*710))
GUICtrlSendMsg(-1, 0x101E, 2, Int(.7*710)-20)
GUISetState(@SW_SHOW)_Main()
[/autoit] [autoit][/autoit] [autoit]Func _DisplayFileMessages($hBuffer, $sDir)
[/autoit] [autoit][/autoit] [autoit]
Local $hFileNameInfo, $pBuffer, $hTime
Local $nFileNameInfoOffset = 12, $nOffset = 0, $nNext = 1
$pBuffer = DllStructGetPtr($hBuffer)
While $nNext <> 0
$hFileNameInfo = DllStructCreate($tagFNIIncomplete, $pBuffer + $nOffset)
$hFileName = DllStructCreate("wchar FileName[" & DllStructGetData($hFileNameInfo, "FileNameLength")/2 & "]", $pBuffer + $nOffset + $nFileNameInfoOffset)
$hTime = _Date_Time_GetSystemTime()
Switch DllStructGetData($hFileNameInfo, "Action")
Case $FILE_ACTION_ADDED
_GUICtrlListView_InsertItem($lvNotifications, "Created", 0)
Case $FILE_ACTION_REMOVED
_GUICtrlListView_InsertItem($lvNotifications, "Deleted", 0)
Case $FILE_ACTION_MODIFIED
_GUICtrlListView_InsertItem($lvNotifications, "Modified", 0)
Case $FILE_ACTION_RENAMED_OLD_NAME
_GUICtrlListView_InsertItem($lvNotifications, "Rename-", 0)
Case $FILE_ACTION_RENAMED_NEW_NAME
_GUICtrlListView_InsertItem($lvNotifications, "Rename+", 0)
Case Else
_GUICtrlListView_InsertItem($lvNotifications, "Unknown", 0)
EndSwitch
_GUICtrlListView_AddSubItem($lvNotifications, 0, _Date_Time_SystemTimeToDateTimeStr($hTime), 1)
_GUICtrlListView_AddSubItem($lvNotifications, 0, $sDir & DllStructGetData($hFileName, "FileName"), 2)
$nNext = DllStructGetData($hFileNameInfo, "NextEntryOffset")
$nOffset += $nNext
WEnd
EndFuncFunc _GetBufferHandle ()
[/autoit] [autoit][/autoit] [autoit]
Return DllStructCreate("ubyte[2048]")
EndFuncFunc _GetDirectoryChanges($aDirHandles, $hBuffer, $aOverlapped, $hEvents, $aDirs, $bAsync = Default, $nTimeout = Default)
[/autoit] [autoit][/autoit] [autoit]
Local $aMsg, $i, $nBytes = 0
If $nTimeout = -1 Or IsKeyword($nTimeout) Then $nTimeout = 250
If Not $bAsync Then $nTimeout = $INFINITE
$aMsg = DllCall("User32.dll", "dword", "MsgWaitForMultipleObjectsEx", _
"dword", UBound($aOverlapped), _
"ptr", DllStructGetPtr($hEvents), _
"dword", $nTimeout, _
"dword", 0, _
"dword", 0x6)
$i = $aMsg[0]
Switch $i
Case 0 To UBound($aDirHandles)-1
If Not _WinAPI_GetOverlappedResult($aDirHandles[$i], DllStructGetPtr($aOverlapped[$i]), $nBytes, True) Then
ConsoleWrite("!> GetOverlappedResult Error(" & @error & "): " & _WinAPI_GetLastErrorMessage() & @LF)
Return 0
EndIf
DllCall("Kernel32.dll", "Uint", "ResetEvent", "uint", DllStructGetData($aOverlapped[$i], "hEvent"))
_DisplayFileMessages($hBuffer, $aDirs[$i])
_SetReadDirectory($aDirHandles[$i], $hBuffer, $aOverlapped[$i],False,True)
Return $nBytes
EndSwitch
Return 0
EndFuncFunc _GetDirHandle($sDir)
[/autoit] [autoit][/autoit] [autoit]
Local $aResult
$aResult = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
"str", $sDir, _
"int", $FILE_LIST_DIRECTORY, _
"int", BitOR($FILE_SHARE_DELETE,$FILE_SHARE_READ,$FILE_SHARE_WRITE), _
"ptr", 0, _
"int", $OPEN_EXISTING, _
"int", BitOR($FILE_FLAG_BACKUP_SEMANTICS,$FILE_FLAG_OVERLAPPED), _
"int", 0)
If $aResult[0] = 0 Then
ConsoleWrite("!> CreateFile Error (" & @error & "): " & _WinAPI_GetLastErrorMessage() & @LF)
Exit
EndIf
Return $aResult[0]
EndFuncFunc _GetEventHandles ($aOverlapped)
[/autoit] [autoit][/autoit] [autoit]
Local $i, $hEvents
$hEvents = DllStructCreate("hwnd hEvent[" & UBound($aOverlapped) & "]")
For $i=1 To UBound($aOverlapped)
DllStructSetData($hEvents, "hEvent", DllStructGetData($aOverlapped[$i-1], "hEvent"), $i)
Next
Return $hEvents
EndFuncFunc _GetOverlappedHandle ()
[/autoit] [autoit][/autoit] [autoit]
Local $hOverlapped = DllStructCreate($tagOVERLAPPED)
For $i=1 To 5
DllStructSetData($hOverlapped, $i, 0)
Next
Return $hOverlapped
EndFuncFunc _Main ()
[/autoit] [autoit][/autoit] [autoit]
$bSelected = False
$bMonitorDone = True
$bMonitor = False
While 1
If Not $bMonitorDone Then _MonitorDirs()
If $bMonitor And _GUICtrlListBox_GetCount($lbDirectories) = 0 Then
$bMonitor = Not $bMonitor
GUICtrlSetState($btMonitor, $GUI_DISABLE)
ElseIf Not $bMonitor And _GUICtrlListBox_GetCount($lbDirectories) > 0 Then
$bMonitor = Not $bMonitor
GUICtrlSetState($btMonitor, $GUI_ENABLE)
EndIf
If $bSelected And _GUICtrlListBox_GetCurSel($lbDirectories) = -1 Then
$bSelected = Not $bSelected
GUICtrlSetState($btRemove, $GUI_DISABLE)
ElseIf Not $bSelected And _GUICtrlListBox_GetCurSel($lbDirectories) <> -1 Then
$bSelected = Not $bSelected
GUICtrlSetState($btRemove, $GUI_ENABLE)
EndIf
WEnd
EndFuncFunc _MonitorDirs ()
[/autoit] [autoit][/autoit] [autoit]
Local $i, $nMax, $hBuffer, $hEvents
$nMax = _GUICtrlListBox_GetCount($lbDirectories)
Local $aDirHandles[$nMax], $aOverlapped[$nMax], $aDirs[$nMax]
$hBuffer = _GetBufferHandle()
For $i = 0 To $nMax-1
$aDirs[$i] = _GUICtrlListBox_GetText($lbDirectories, $i)
$aDirHandles[$i] = _GetDirHandle($aDirs[$i])
$aOverlapped[$i] = _GetOverlappedHandle()
_SetReadDirectory($aDirHandles[$i], $hBuffer, $aOverlapped[$i], True, True)
Next
$hEvents = _GetEventHandles($aOverlapped)
While Not $bMonitorDone
_GetDirectoryChanges($aDirHandles, $hBuffer, $aOverlapped, $hEvents, $aDirs)
WEnd
EndFuncFunc _OnEvent_Add ()
[/autoit] [autoit][/autoit] [autoit]
Local $sDir, $nMax, $i
$sDir = FileSelectFolder("Select directory to monitor", "")
If $sDir <> "" Then
If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
$nMax = _GUICtrlListBox_GetCount($lbDirectories)-1
For $i = 0 To $nMax
If _GUICtrlListBox_GetText($lbDirectories, $i) = $sDir Then Return
Next
_GUICtrlListBox_AddString($lbDirectories, $sDir)
EndIf
EndFuncFunc _OnEvent_Clear ()
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($lvNotifications))
EndFuncFunc _OnEvent_Close ()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc _OnEvent_Monitor ()
[/autoit] [autoit][/autoit] [autoit]
If $bMonitorDone Then
$bMonitorDone = False
GUICtrlSetData($btMonitor, "Stop Monitor")
GUICtrlSetState($btAdd, $GUI_DISABLE)
GUICtrlSetState($btRemove, $GUI_DISABLE)
GUICtrlSetState($lbDirectories, $GUI_DISABLE)
$bSelected = False
Else
$bMonitorDone = True
GUICtrlSetState($lbDirectories, $GUI_ENABLE)
GUICtrlSetState($btAdd, $GUI_ENABLE)
GUICtrlSetData($btMonitor, "Start Monitor")
EndIf
EndFuncFunc _OnEvent_Remove ()
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListBox_DeleteString($lbDirectories, _GUICtrlListBox_GetCurSel($lbDirectories))
EndFuncFunc _SetReadDirectory($hDir, $hBuffer, $hOverlapped, $bInitial = False, $bSubtree = False)
[/autoit]
Local $hEvent, $pBuffer, $nBufferLength, $pOverlapped
$pBuffer = DllStructGetPtr($hBuffer)
$nBufferLength = DllStructGetSize($hBuffer)
$pOverlapped = DllStructGetPtr($hOverlapped)
If $bInitial Then
$hEvent = DllCall("Kernel32.dll", "hwnd", "CreateEvent", _
"uint", 0, _
"int", True, _
"int", False, _
"uint", 0)
If $hEvent[0] = 0 Then
ConsoleWrite("!> CreateEvent Failed (" & _WinAPI_GetLastError() & "): " & _WinAPI_GetLastErrorMessage() & @LF)
Exit
EndIf
DllStructSetData($hOverlapped, "hEvent", $hEvent[0])
EndIf
$aResult = DllCall("Kernel32.dll", "int", "ReadDirectoryChangesW", _
"hwnd", $hDir, _
"ptr", $pBuffer, _
"dword", $nBufferLength, _
"int", $bSubtree, _
"dword", BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, _
$FILE_NOTIFY_CHANGE_SIZE,$FILE_NOTIFY_CHANGE_DIR_NAME,$FILE_NOTIFY_CHANGE_SECURITY), _
"uint", 0, _
"uint", $pOverlapped, _
"uint", 0)
If $aResult[0] = 0 Then
ConsoleWrite("!> ReadDirectoryChangesW Error(" & @error & "): " & _WinAPI_GetLastErrorMessage() & @LF)
Exit
EndIf
Return $aResult[0]
EndFuncmfg K4z