1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. K4z

Beiträge von K4z

  • letzte leere Zeile löschen

    • K4z
    • 17. Juli 2012 um 21:22

    Klar geht das, aber warum nicht gleich an der Ursache des Problems ansetzen...

  • letzte leere Zeile löschen

    • K4z
    • 17. Juli 2012 um 19:01

    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 = "|")
    ; 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)

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

    ; determine last entry
    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

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

    ; Open output file for overwrite by default, or use input file handle if passed
    Local $hFile
    If IsString($File) Then
    $hFile = FileOpen($File, $FO_OVERWRITE)
    Else
    $hFile = $File
    EndIf
    If $hFile = -1 Then Return SetError(1, 0, 0)

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

    ; Write array data to file
    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

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

    ; Close file only if specified by a string path
    If IsString($File) Then FileClose($hFile)

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

    ; Return results
    If $ErrorSav Then Return SetError($ErrorSav, 0, 0)
    Return 1
    EndFunc ;==>_FileWriteFromArray

    [/autoit]
  • Brainfuck - Compiler, IDE und Interpreter

    • K4z
    • 16. Juli 2012 um 10:19

    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...

  • Brainfuck - Compiler, IDE und Interpreter

    • K4z
    • 16. Juli 2012 um 09:52

    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...

  • Brainfuck - Compiler, IDE und Interpreter

    • K4z
    • 15. Juli 2012 um 22:54

    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:)

  • [STEAM] Source UDF

    • K4z
    • 11. Juli 2012 um 16:56

    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 Verbindung

    Getestet 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")
    Const $A2S_RULES = Binary("0xFFFFFFFF56")
    Const $A2S_PLAYER = Binary("0xFFFFFFFF55")
    Const $A2S_INFO = Binary("0xFFFFFFFF54536F7572636520456E67696E6520517565727900")
    Global $g_PING = 0, $socket

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

    ; ////////////////////// Functions \\\\\\\\\\\\\\\\\\\\\\
    ; ===================\
    ;_SourceConnect
    ;_SourceGetChallenge
    ;_SourceGetInfo
    ;_SourceGetPlayers
    ;_SourceGetRules
    ;_SourceClose
    ;
    ;__SourceReceiveData
    ;__SourceBinaryToArray
    ; ===================/

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; 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

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _SourceClose
    ; Description ...: Schließt die offene UDP-Verbindung
    ; Syntax ........: _SourceClose()
    ; ===============================================================================================================================
    Func _SourceClose($socket)
    UDPCloseSocket($socket)
    UDPShutdown()
    EndFunc ;==>_SourceClose

    [/autoit]

    Testscript:

    Spoiler anzeigen
    [autoit]

    #include "steam.au3"

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

    $socket = _SourceConnect("77.111.213.213:27015")
    $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)

    [/autoit]

    K4z

    Dateien

    steam.au3 9,49 kB – 485 Downloads
  • verneinte IF Schleife mit OR in der Bedingung

    • K4z
    • 10. Juli 2012 um 17:34

    Ich frag mich was alle gegen reguläre Ausdrücke haben...
    Das Beispiel zeigt doch sehr gut, dass sie nicht ganz so sinnlos sind.

  • verneinte IF Schleife mit OR in der Bedingung

    • K4z
    • 10. Juli 2012 um 17:26

    So ist es ein bisschen kürzer:

    [autoit]

    $ID = "W442525"
    If StringRegExp($ID, "^[^WHSZMKFCE]") Then
    MsgBox(0, "D.3-ID Agent", "Es handelt sich um keine gültige Identnummer.")
    $Fehler = 1
    Return
    EndIf

    [/autoit]


    Auf deine Art müsste es so gehn:

    Spoiler anzeigen
    [autoit]

    $ID = "A442525"
    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

    [/autoit]
  • _SendMessage & _SendMessageA | Unterschiede, Funktion,...

    • K4z
    • 10. Juli 2012 um 14:27

    Hier noch ein kleines Beispiel:
    Testfenster compilieren und ausführen:

    Spoiler anzeigen
    [autoit]

    GUICreate("TestFenster", 140, 55, 308, 334)
    GUICtrlCreateButton("Button", 32, 15, 75, 25)
    GUISetState(@SW_SHOW)

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

    While Sleep(100)
    If GUIGetMsg() = -3 Then Exit
    WEnd

    [/autoit]

    Folgender Code macht aus dem Button ein Radiobutton:

    Spoiler anzeigen
    [autoit]

    #include <SendMessage.au3>

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

    $BM_SETSTYLE = 0x00F4
    $BS_RADIOBUTTON = 0x00000004

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

    $hWnd = ControlGetHandle("TestFenster", "", 3)
    _SendMessageA($hWnd, $BM_SETSTYLE, $BS_RADIOBUTTON, 1)

    [/autoit]

    Eigentlich könnte man hier mal ein SendMessage Tutorial schreiben...

  • _SendMessage & _SendMessageA | Unterschiede, Funktion,...

    • K4z
    • 10. Juli 2012 um 13:53

    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")
    WinWaitActive("Unbenannt - Editor")

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

    $hWnd = WinGetHandle("Unbenannt - Editor")
    $tStruct = DllStructCreate("char[128]")
    DllStructSetData($tStruct, 1, "TestTestTest")
    _SendMessageA($hWnd, $WM_SETTEXT, 0, DllStructGetPtr($tStruct, 1))

    [/autoit]
  • _SendMessage & _SendMessageA | Unterschiede, Funktion,...

    • K4z
    • 10. Juli 2012 um 13:00

    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. "

  • _SendMessage & _SendMessageA | Unterschiede, Funktion,...

    • K4z
    • 10. Juli 2012 um 12:45

    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:

    Zitat

    kann sogut wie kein Englisch

    Das hab ich wohl übersehn...

  • Nummer aus String extrahieren

    • K4z
    • 7. Juli 2012 um 19:18

    Mit regulären Ausdrücken....

    [autoit]

    #include <Array.au3>
    $sString = "Mein strin - Betreff - 002 - alles okay" & @CRLF & _
    "Mein strin - Betreff - 005 - alles okay" & @CRLF & _
    "Mein strin - Betreff - 306 - alles okay"

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

    $aRegexp = StringRegExp($sString, "Mein strin - Betreff - (\d{3}) - alles okay", 3)
    _ArrayDisplay($aRegexp)

    [/autoit]
  • _fileWriteFromArray schreibt nur 3 Einträge

    • K4z
    • 7. Juli 2012 um 17:04

    Irgendwie sieht es so aus als hätt sich da jemand verschrieben...
    So geht's:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #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)

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

    Func _FileWriteFromArrayFixed($File, $a_Array, $i_Base = 0, $i_UBound = 0, $s_Delim = "|")
    ; 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)

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

    ; determine last entry
    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

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

    ; Open output file for overwrite by default, or use input file handle if passed
    Local $hFile
    If IsString($File) Then
    $hFile = FileOpen($File, $FO_OVERWRITE)
    Else
    $hFile = $File
    EndIf
    If $hFile = -1 Then Return SetError(1, 0, 0)

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

    ; Write array data to file
    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

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

    ; Close file only if specified by a string path
    If IsString($File) Then FileClose($hFile)

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

    ; Return results
    If $ErrorSav Then Return SetError($ErrorSav, 0, 0)
    Return 1
    EndFunc ;==>_FileWriteFromArray

    [/autoit]
  • unterschied zwischen dem normalen aufrufen einer UDF und dem aufrufen mit "call"

    • K4z
    • 28. Juni 2012 um 14:46

    Ich verwende eigentlich Call() nur wenn ich keinen festen Funktionsnamen hab.
    vlt ein kleines Beispiel:

    Spoiler anzeigen
    [autoit]

    $iI = 2
    Call("_Func" & $iI)

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

    Func _Func1()
    MsgBox(0, "", "_Func1 wurde aufgerufen!")
    EndFunc

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

    Func _Func2()
    MsgBox(0, "", "_Func2 wurde aufgerufen!")
    EndFunc

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

    Func _Func3()
    MsgBox(0, "", "_Func3 wurde aufgerufen!")
    EndFunc

    [/autoit]

    Mir ist nicht bekannt, dass das mit einem normalen Aufruf möglich ist, ich kann mich aber auch irren...

  • CheckBox und InputBox - Abfragen des Status

    • K4z
    • 28. Juni 2012 um 13:23

    du musst in Zeile 26 statt der 0 ein "" verwenden

  • 2x Countdown gleichzeitig runterzählen

    • K4z
    • 11. Juni 2012 um 17:54

    So vielleicht?:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #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)

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

    Global $iCounter1 = 5, $iCounter2 = 5

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Label1
    AdlibRegister("deine_counter_1", 1000)
    Case $Label2
    AdlibRegister("deine_counter_2", 1000)
    EndSwitch
    WEnd

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

    Func deine_counter_1()
    If $iCounter1 >= 0 Then
    GUICtrlSetData($Label1, $iCounter1)
    $iCounter1 -= 1
    Else
    AdlibUnRegister("deine_counter_1")
    EndIf
    EndFunc

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

    Func deine_counter_2()
    If $iCounter2 >= 0 Then
    GUICtrlSetData($Label2, $iCounter2)
    $iCounter2 -= 1
    Else
    AdlibUnRegister("deine_counter_2")
    EndIf
    EndFunc

    [/autoit]
  • Bug in GUICtrlSetLimit?

    • K4z
    • 10. Juni 2012 um 14:25

    und das ist das limit von einem signed 16bit integer...
    [ gelöst ] Up-/Down-Control bei Input

  • HTML Code verarbeiten

    • K4z
    • 6. Juni 2012 um 23:08

    Weil mir grad eh stink langweilig is, hier ma ein Ansatz mit ner riesigen RegExp :) :

    Spoiler anzeigen
    [autoit]

    #include <Inet.au3>
    #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)

    [/autoit]
  • Process Monitor

    • K4z
    • 6. Juni 2012 um 01:00

    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
    Author: zorphnog (M. Mims)

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

    Script Function:
    Monitors the user defined directories for file activity.

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

    #ce ----------------------------------------------------------------------------

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

    #include <Constants.au3>
    #include <WinAPI.au3>
    #include <Date.au3>
    #include <GUIConstants.au3>
    #include <GuiListBox.au3>
    #include <GuiListView.au3>

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

    Global Const _
    $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)

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

    $gFileMon = GUICreate("Directory Monitor", 731, 385, 194, 126)
    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)

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

    _Main()

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

    Func _DisplayFileMessages($hBuffer, $sDir)
    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
    EndFunc

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

    Func _GetBufferHandle ()
    Return DllStructCreate("ubyte[2048]")
    EndFunc

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

    Func _GetDirectoryChanges($aDirHandles, $hBuffer, $aOverlapped, $hEvents, $aDirs, $bAsync = Default, $nTimeout = Default)
    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
    EndFunc

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

    Func _GetDirHandle($sDir)
    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]
    EndFunc

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

    Func _GetEventHandles ($aOverlapped)
    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
    EndFunc

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

    Func _GetOverlappedHandle ()
    Local $hOverlapped = DllStructCreate($tagOVERLAPPED)
    For $i=1 To 5
    DllStructSetData($hOverlapped, $i, 0)
    Next
    Return $hOverlapped
    EndFunc

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

    Func _Main ()
    $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
    EndFunc

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

    Func _MonitorDirs ()
    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
    EndFunc

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

    Func _OnEvent_Add ()
    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
    EndFunc

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

    Func _OnEvent_Clear ()
    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($lvNotifications))
    EndFunc

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

    Func _OnEvent_Close ()
    Exit
    EndFunc

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

    Func _OnEvent_Monitor ()
    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
    EndFunc

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

    Func _OnEvent_Remove ()
    _GUICtrlListBox_DeleteString($lbDirectories, _GUICtrlListBox_GetCurSel($lbDirectories))
    EndFunc

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

    Func _SetReadDirectory($hDir, $hBuffer, $hOverlapped, $bInitial = False, $bSubtree = False)
    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]
    EndFunc

    [/autoit]

    mfg K4z

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™