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

Beiträge von Oscar

  • Mauskoordinaten per TCP oder UDP senden

    • Oscar
    • 5. August 2009 um 18:59

    Dieser "Trick" basiert darauf, dass ein Integerwert bei AutoIt einen Wertebereich von 32 Bit darstellt.
    Das sind 4 Byte (mit je 8 Bit) oder 8 Nibble (mit je 4 Bit). Ein Nibble wird hexadezimal mit einem "F" dargestellt, also sind 32 Bit = 0xFFFFFFFF.
    Um mehrere Variablen in einem Integerwert unterzubringen muss man den Wert maskieren (BitAnd) und dann an die vorgesehene Position in der Integervariablen verschieben (BitShift).
    Aufpassen muss man mit dem höchstwertigsten Bit, denn dieses wird als Vorzeichenbit verwendet (signed Integer).

    Damals, beim programmieren auf dem C64, habe ich das Prinzip benutzt, um Speicherplatz zu sparen. Heutzutage hat man eigentlich genug davon. ;)

  • 'Bei Mausbewegung läuft Script schneller' geworden zu 'Variablen Vergleich mit Abweichung'

    • Oscar
    • 5. August 2009 um 18:41

    Dafür kann man am besten Switch benutzen:

    [autoit]


    $xPos = 2

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

    Switch $xPos
    Case 0 To 9, 600 To 609
    MsgBox(0,0,'Wand')
    EndSwitch

    [/autoit]
  • µit - Juli

    • Oscar
    • 5. August 2009 um 16:28

    Hatte ich bei mir auch schon getestet.
    Mehrere "If...Then" sparen zwar Codezeilen ein, weil man direkt hinter dem "Then" den Befehl schreiben kann, aber "If...Then...Else...EndIf" ist schneller.

  • Txt inhalt in editbox laden

    • Oscar
    • 5. August 2009 um 16:11

    subzero007: Deine Funktion kann man ziemlich kürzen. :)

    [autoit]


    Func msg()
    $var = FileOpenDialog("", @ScriptDir & "\", "Text (*.txt)", 1 + 4)
    If Not @error Then GUICtrlSetData($Editbox, FileRead($var))
    EndFunc ;==>msg

    [/autoit]
  • Mauskoordinaten per TCP oder UDP senden

    • Oscar
    • 5. August 2009 um 16:05

    So geht es auch mit drei Werten, wenn man den Wertebereich eingrenzt:

    [autoit]


    #include <Array.au3>
    ; Das Array $aSend enthält die drei Werte. Die ersten beiden Werte dürfen im zwischen 0...4095 und der Dritte zwischen 0...15 liegen
    Dim $aSend[3] = [4095, 4095, 15]

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

    $iSend = BitOR(BitShift(BitAND($aSend[0], 0x00000FFF), -16), BitShift(BitAND($aSend[1], 0x00000FFF), -4), BitAND($aSend[2], 0x0000000F)) ; umwandeln in ein Integerwert

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

    MsgBox(0,'So wird die Zahl gesendet:',Hex($iSend))

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

    Dim $aReceive[3] = [BitShift(BitAND($iSend, 0x0FFF0000), 16), BitShift(BitAND($iSend, 0x0000FFF0), 4), BitAND($iSend, 0x0000000F)] ; wieder zurück in ein Array
    _ArrayDisplay($aReceive, 'Werte beim Empfänger:')

    [/autoit]
  • 'Bei Mausbewegung läuft Script schneller' geworden zu 'Variablen Vergleich mit Abweichung'

    • Oscar
    • 5. August 2009 um 04:18

    Das liegt an GuiGetMsg, der die Prozessorlast dynamisch reduziert/erhöht, sobald die Maus angehalten/bewegt wird.
    Läßt sich am besten umgehen, indem man den OnEventMode benutzt. Ansonsten müsstest Du mit Timern arbeiten.

  • Kleine Profiling-UDF

    • Oscar
    • 4. August 2009 um 18:13

    Wenn Du die Funktionen nicht verstehst, dann brauchst Du sie auch nicht. ;)

  • Mauskoordinaten per TCP oder UDP senden

    • Oscar
    • 4. August 2009 um 18:06

    Nun, zum einen könntest Du einfach zwei Pakete (mit den X- und Y-Koordinaten) senden oder Du packst beide Werte in ein Integerwert zusammen:

    [autoit]


    #include <Array.au3>
    $aMousePos = MouseGetPos()
    _ArrayDisplay($aMousePos, 'Die beiden Werte von MouseGetPos:')

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

    $iSend = BitOR(BitShift(BitAND($aMousePos[0], 0x0000FFFF), -16), BitAND($aMousePos[1], 0x0000FFFF)) ; umwandeln in ein Integerwert

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

    MsgBox(0,'So wird die Zahl gesendet:',Hex($iSend))

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

    Dim $aReceive[2] = [BitShift(BitAND($iSend, 0xFFFF0000), 16), BitAND($iSend, 0x0000FFFF)] ; wieder zurück in ein Array
    _ArrayDisplay($aReceive, 'Wieder zwei Werte beim Empfänger:')

    [/autoit]
  • µit - Juli

    • Oscar
    • 4. August 2009 um 14:28

    Gratulation an BugFix! :thumbup:
    Geschwindigkeit geht vor, das sehe ich auch so.
    Diesbezüglich könnte man das Script von BugFix noch etwas tunen:

    Spoiler anzeigen
    [autoit]


    Func _StringInStrCount($sString, $sSearch = '', $bSens = False, $bPartial = False, $sDelim = '', $bReturn = False)
    If Not $sSearch And $sDelim Then Return UBound(StringSplit(StringRegExpReplace($sString, $sDelim, ''), '', 2))
    If Not $sSearch And Not $sDelim Then Return StringLen($sString)
    Local $ret, $Out = '', $indP = 0, $aPat[4][2] = [['(?i)\b', '\b'],['\b', '\b'],['', ''],['(?i)', '']]
    If $bSens And Not $bPartial Then $indP = 1
    If $bSens And $bPartial Then $indP = 2
    If Not $bSens And $bPartial Then $indP = 3
    If $sSearch And $sDelim Then
    Local $split = StringSplit($sSearch, $sDelim, 2), $sum = 0
    For $i In $split
    $ret = StringRegExp($sString, $aPat[$indP][0] & $i & $aPat[$indP][1], 3)
    If IsArray($ret) Then
    $Out &= UBound($ret) & $sDelim
    $sum += UBound($ret)
    Else
    $Out &= 0 & $sDelim
    EndIf
    Next
    If $bReturn Then Return StringSplit(StringTrimRight($Out, StringLen($sDelim)), $sDelim)
    Return $sum
    EndIf
    $ret = StringRegExp($sString, $aPat[$indP][0] & $sSearch & $aPat[$indP][1], 3)
    If $bReturn Then Return StringSplit(UBound($ret), ',')
    Return UBound($ret)
    EndFunc ;==>_StringInStrCount

    [/autoit]
  • Launcher für script

    • Oscar
    • 4. August 2009 um 13:52

    Ok, mal ein Beispiel:
    Nehmen wir an, Du hast Dein Hauptscript compiliert und das Programm hat jetzt den Namen "DeinProgramm.exe".
    Dann nimmst Du dieses Script:

    [autoit]


    $sFilename = 'C:\Pfad\DeinProgramm.exe'
    $hFile = FileOpen($sFilename, 16)
    If $hFile = -1 Then Exit
    $sFile = FileRead($hFile)
    FileClose($hFile)
    $sFile = _StringEncrypt(1, $sFile, 'Passwort')
    $hFile = FileOpen('C:\Pfad\DeinProgramm.enc', 2 + 16)
    If $hFile = -1 Then Exit
    FileWrite($hFile, $sFile)
    FileClose($hFile)

    [/autoit]


    und erstellst damit die Datei "DeinProgramm.enc". Diese Datei gibst Du dann zusammen mit dem Launcher weiter.
    Im Launcher entschlüsselst Du das Hauptscript in ein temporäres Verzeichnis und startest es. Der Launcher wartet dann solange, bis das Hauptscript wieder beendet wird und löscht die temporäre Datei anschließend:

    [autoit]


    $sFilename = 'C:\Pfad\DeinProgramm.enc'
    $hFile = FileOpen($sFilename, 16)
    If $hFile = -1 Then Exit
    $sFile = FileRead($hFile)
    FileClose($hFile)
    $sFile = _StringEncrypt(0, $sFile, 'Passwort')
    $hFile = FileOpen(@TempDir & '\DeinProgramm.exe', 2 + 16)
    If $hFile = -1 Then Exit
    FileWrite($hFile, $sFile)
    FileClose($hFile)
    ShellExecute(@TempDir & '\DeinProgramm.exe')
    WinWait('Titel von Deinem Programm')
    WinWaitClose('Titel von Deinem Programm')
    FileDelete(@TempDir & '\DeinProgramm.exe')

    [/autoit]
  • Launcher für script

    • Oscar
    • 4. August 2009 um 04:11

    Ich verstehe zwar nicht, warum man zum prüfen ein extra Script (Launcher) benötigt, aber um Deine Frage zu beantworten:
    Verschlüssele das Hauptscript. Der Launcher entschlüsselt und startet es dann.

  • Auswahlfenster ertellen mittels AutoIT 3

    • Oscar
    • 4. August 2009 um 03:55

    Andy, schönes Beispiel, aber da fehlt noch die Möglichkeit die Programmnamen anzugeben und das aufrufen der eigentlichen Installations-Scripte.
    Habe das Beispiel mal entsprechend erweitert:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt('GUIOnEventMode', 1) ;eventmodus einschalten

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

    GUICreate("Programm-Installation") ;gui basteln
    GUICtrlCreateLabel("Bitte Programme auswählen, dann Installieren!", 10, 10, 300, 30)
    Dim $check[10] ;Array für 10 checkboxen
    Dim $aProgNames[10] = ['AutoIt3', 'SciTE', 'Firefox', 'Thunderbird', 'Adobe Reader', 'IrfanView', 'PopTray', 'AntiVir', 'TrueCrypt', 'Miranda'] ;hier die Namen der Programme eintragen
    For $i = 0 To 9 ;die checkboxen-id dem array zuweisen
    $check[$i] = GUICtrlCreateCheckbox($aProgNames[$i], 10, 30 + 30 * $i, 150, 20)
    Next
    $installbutton = GUICtrlCreateButton("Installieren", 200, 40, 80, 30) ;button
    $endebutton = GUICtrlCreateButton("Ende", 200, 90, 80, 30) ;button
    GUICtrlSetOnEvent($installbutton, "_install") ;wenn event "button "Installieren" gedrückt" , die funktion _install auslösen
    GUICtrlSetOnEvent($endebutton, "_ende") ; wenn event endebutton gedrückt, dan funktion _ende auslösen
    GUISetOnEvent($GUI_EVENT_CLOSE, "_ende")
    GUISetState() ; gui aktivieren

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

    While 1 ; endlosschleife, wir warten auf die events
    Sleep(100)
    WEnd

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

    Func _install() ;programme installieren
    For $i = 0 To 9
    If GUICtrlRead($check[$i]) = $GUI_CHECKED Then Call('_Progr' & $i)
    Next
    EndFunc ;==>_install

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

    Func _ende() ;ende
    Exit
    EndFunc ;==>_ende

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

    Func _Progr0()
    MsgBox(0, "Installation:", $aProgNames[0]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr1()
    MsgBox(0, "Installation:", $aProgNames[1]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr2()
    MsgBox(0, "Installation:", $aProgNames[2]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr3()
    MsgBox(0, "Installation:", $aProgNames[3]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr4()
    MsgBox(0, "Installation:", $aProgNames[4]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr5()
    MsgBox(0, "Installation:", $aProgNames[5]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr6()
    MsgBox(0, "Installation:", $aProgNames[6]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr7()
    MsgBox(0, "Installation:", $aProgNames[7]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr8()
    MsgBox(0, "Installation:", $aProgNames[8]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

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

    Func _Progr9()
    MsgBox(0, "Installation:", $aProgNames[9]) ;statt der MsgBox steht hier dann das Installations-Script
    EndFunc

    [/autoit]
  • Prüfen ob Datei geöffnet ist

    • Oscar
    • 3. August 2009 um 09:41

    Direkt nicht, aber man kann einen indirekten Weg gehen:
    Programm A will auf die Ini zugreifen. Legt eine Nullbyte-Datei (egal, z.B.: bla.txt) an und greift dann auf die Ini zu.
    Will nun Programm B auf die Ini zugreifen, prüft es zuerst, ob eine Datei "bla.txt" existiert. Wenn ja, greift gerade Programm A auf die Ini zu, wenn nicht, legt Programm B die Datei "bla.txt" an und greift dann auf die Ini zu.
    Nach dem Zugriff wird dann die Datei "bla.txt" wieder gelöscht.

    Natürlich muss Programm A vor dem anlegen der Datei auch erst prüfen, ob diese bereits existiert (Programm B könnte ja gerade auf die Ini zugreifen).

  • Datum countdown

    • Oscar
    • 3. August 2009 um 04:41

    Mal auf die Schnelle ein Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <StaticConstants.au3>
    #include <Date.au3>

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

    Global $DestinationDate = '2017/08/03 12:00:00'
    Global $ahDate[6], $ahNames[6]
    Global $aNames[6] = ['Jahr', 'Monat', 'Tag', 'Stunde', 'Minute', 'Sekunde']

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

    GUICreate('Countdown', 380, 100)
    For $i = 0 To 5
    $ahNames[$i] = GUICtrlCreateLabel($aNames[$i], 10 + $i * 60, 20, 55, 20, $SS_CENTER)
    $ahDate[$i] = GUICtrlCreateLabel('', 10 + $i * 60, 40, 55, 30, $SS_CENTER)
    GUICtrlSetFont(-1, 16, 600)
    Next
    _Update()
    GUISetState()
    AdlibEnable('_Update', 1000)
    Do
    Until GUIGetMsg() = -3

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

    Func _Update()
    Local $aDate = _DateToDateDiffArray($DestinationDate)
    For $i = 0 To 5
    If $i < 3 Then
    If $aDate[$i] <> 1 Then
    GUICtrlSetData($ahNames[$i], $aNames[$i] & 'e')
    Else
    GUICtrlSetData($ahNames[$i], $aNames[$i])
    EndIf
    Else
    If $aDate[$i] <> 1 Then
    GUICtrlSetData($ahNames[$i], $aNames[$i] & 'n')
    Else
    GUICtrlSetData($ahNames[$i], $aNames[$i])
    EndIf
    EndIf
    GUICtrlSetData($ahDate[$i], $aDate[$i])
    Next
    EndFunc

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

    Func _DateToDateDiffArray($sDate)
    Local $aTime[6], $aDiff[6] = ['Y', 'M', 'D', 'h', 'n', 's']
    For $i = 0 To 5
    $aTime[$i] = _DateDiff($aDiff[$i], _NowCalc(), $sDate)
    $sDate = _DateAdd($aDiff[$i], -$aTime[$i], $sDate)
    Next
    Return $aTime
    EndFunc

    [/autoit]
  • thumbs

    • Oscar
    • 2. August 2009 um 22:51

    So:

    [autoit]

    ShellExecute('explorer.exe', @UserProfileDir & '\Eigene Dateien\Eigene Bilder')

    [/autoit]


    ;)

    Nee, im Ernst: beschreib mal genauer, was Du vorhast. Am besten, wenn Du schonmal eine GUI erstellst, dann kann man leichter sehen, was wohin soll.

  • _ByteAutoSize

    • Oscar
    • 2. August 2009 um 12:03

    Ich brauchte gerade eine Funktion zum anzeigen von Datei-/Ordnergrößen. Die Funktion sollte automatisch (je nach Größe) die jeweils passende Einheit (Byte, KByte, MByte, GByte) ausrechnen und entsprechend zurückgeben.
    Vielleicht kann ja noch jemand so eine Funktion gebrauchen:

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    MsgBox(0, 'Beispiel 1', _ByteAutoSize(54225976, 2, 4, False))

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

    MsgBox(0, 'Beispiel 2', _ByteAutoSize(DriveSpaceTotal('c:') * 2 ^ 20)) ; DriveSpaceTotal gibt den Wert in MByte zurück, deshalb "* 2 ^ 20"

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

    ;===============================================================================
    ; Function Name: _ByteAutoSize($iSize, $iRound = 2, $iFormat = 0, $bThousands = True)
    ; Description:: Gibt einen Bytewert in einer bestimmten Einheit zurück
    ; Parameter(s): $iSize = Größe in Byte übergeben
    ; $iRound = Anzahl der Nachkommastellen (0...8)
    ; $iFormat = bestimmt den Rückgabewert
    ; 0 = Automatisch (je nach übergebenen Wert)
    ; 1 = in Byte
    ; 2 = in KByte
    ; 3 = in MByte
    ; 4 = in GByte
    ; $bThousands = Rückgabe mit Tausendertrennzeichen (True/False)
    ; Requirement(s): #include <String.au3>
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _ByteAutoSize($iSize, $iRound = 2, $iFormat = 0, $bThousands = True)
    Local $aSize[4] = [' Byte', ' KByte', ' MByte', ' GByte'], $sReturn
    If $iFormat < 0 Or $iFormat > 4 Then $iFormat = 0
    If $iRound < 0 Or $iRound > 8 Then $iRound = 2
    If Not IsBool($bThousands) Then $bThousands = False
    $iSize = Abs($iSize)
    If $iFormat = 0 Then
    For $i = 30 To 0 Step -10
    If $iSize > (2 ^ $i) Then
    $iFormat = $i / 10 + 1
    ExitLoop
    EndIf
    Next
    EndIf
    $sReturn = Round($iSize / (2 ^ (($iFormat - 1) * 10)), $iRound)
    If $bThousands Then $sReturn = _StringAddThousandsSep($sReturn, '.', ',')
    Return $sReturn & $aSize[$iFormat - 1]
    EndFunc ;==>_ByteAutoSize

    [/autoit]
  • _MultiFileCopy

    • Oscar
    • 2. August 2009 um 11:34

    Hast Du diesen Teil:

    [autoit]


    ;===werden benötigt=============================================================
    #include<String.au3>
    #include<Misc.au3>
    Global $strFiles = '', $strSize = 0
    ;===============================================================================

    [/autoit]


    eventuell entfernt?

  • µit - Juli

    • Oscar
    • 2. August 2009 um 06:29

    Wie viele von euch haben denn mitgemacht?
    Ich habe leider den Abgabetermin etwas verschlafen (mein Script war schon lange fertig, habe aber vergessen es eukalyptus zu schicken). Das habe ich heute mal nachgeholt (hoffe, das zählt noch).

  • Schiffe versenken [v.0.1 Beta]

    • Oscar
    • 2. August 2009 um 05:53

    "Schiffe versenken" war mal eine Aufgabe aus einem Wettbewerb.
    Vielleicht findest Du dort noch Anregungen. :)

  • TLFS

    • Oscar
    • 2. August 2009 um 04:14

    Wieso tot? Mein Script lebt! ;)

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™