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

Beiträge von Kanashius

  • AdlibRegister sinnvoll einsetzen

    • Kanashius
    • 14. Juni 2022 um 08:47

    Keine Ahnung, wie AdlibRegister implementiert ist, aber man sollte auch bedenken, dass normalerweise, wenn mit solchen Funktionen gearbeitet wird, Mechanismen verwendet werden, die keinen Code ausführen und die Zeit warten, ohne Code auszuführen.

    Dementsprechend sollte man diese Nutzen um Anweisungen zu sparen => bessere Performance und ggf. bei Laptops relevant: Prozessorkerne werden in den Ruhezustand verlagert, bis es weitergeht.

    So wie der Code von Mars geschrieben ist, wird permanent Code ausgeführt => (Das Sleep dürfte ebenfalls darunter fallen und das Problem mindern, aber im letztendlich wird alle 10ms Code ausgeführt, der ggf. komplett unnötig ist).

    Ist halt die Farge, wie wichtig einem so etwas ist, aber bei vielen Programmen, die so programmiert werden summiert es sich... Deshalb würd ich sagen, dass dauerschleifen eher schlecht sind, wenn nicht permanent was passieren soll.

    Bei Code für Smartphones sieht man sowas ganz gut. Alles ist darauf ausgelegt, dass es von außen angestoßen wird und möglichst nirgends permanente Überwachungsschleifen sind. Dadurch hat das Betriebssystem mehr Kontrolle und kann ggf. Energiesparmaßnahmen durchführen.

    Am PC seh ich es aber nicht ganz so kritisch und wenn eh Code ausgeführt wird, der die Schleife sowieso erfordert, seh ich auch keinen Grund nicht noch 6 Anweisungen mehr zu machen, wenn es einfacher ist.

    Mit den Ressourcen, die heutzutage zur Verfügung stehen, wird in vielen Fällen eh nicht mehr wirklich viel auf Optimierung geachtet.

    Bezogen auf die Ürsprüngliche Anfrage von Flo...:

    Wenn du eh die ganze Zeit mit Usern interagierst und dein Code läuft, kann es Sinn machen, die Anfragen in die Schleifen einzubauen. Je nachdem, wie lange die sich wiederholenden Abfragen dauern, macht es ggf. Sinn, diese aufzuteilen um den ersten Teil auszuführen, dann die Hauptschleife wieder abzuarbeiten (und auf User-Input zu reagieren) und den anderen Teil danach weiter auszuführen. Das kommt halt ganz drauf an, wie dein Code aussieht und wie lange die Abfragen und deren Verarbeitung dauern.

  • Internet-Kommunikation - Nervige PopUp-Fenster

    • Kanashius
    • 4. Juni 2022 um 18:31

    Internet verbindungen kannst du mit TCPConnect/UDPSend erstellen. Darüber kannst du beliebige Daten austauschen, musst aber natürlich alle Protokolle, die moderne Webseiten brauchen, unterstützen.

    Die Grundlage dafür wären bei HTTP zu finden, da das für die Dateiübertragung verwendet wird. Es gibt mehrere versionen, und es sollte http 2 verwendet werden, ggf. kann aber auch version 1.0, 1.1 oder 1.2 ankommen; hängt halt vom server ab...

    RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0

    RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

    HTTP/1.2 Extension Protocol (PEP)

    RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)

    Da kannst du aber vmtl. die Windows API nutzen um nicht alles implementieren zu müssen.

    Danach würd ich nach HTML schauen. Die Basis findest du hier:

    RFC 7992: HTML Format for RFCs

    Und noch andere Versionen, Erweiterungen,... da dürftest du einige RFCs finden, unter anderem ein paar aktuellere (hab nur kurz gesucht, dürfte dort einige geben, die die Änderungen über die Zeit definieren und die alle Unterstützt werden müssen):

    RFC 7992 - HTML Format for RFCs

    RFC 1866 - Hypertext Markup Language - 2.0

    Selbiges gilt auch für CSS und für alle modernen Webseiten auch JavaScript (Was eine ganze (, umfangreiche) Script-Sprache ist, also mehr Aufwand haben dürfte, als einen eigenen AutoIt Interpreter zu schreiben).

    Dazu kommt neuerdings auch WebAssembly, was ebenfalls interpretierter ByteCode ist, also nochmal eine ganze Sprache in Maschinencode form.

    Dann gibts noch andere Verbindungsmöglichkeiten, wie z.B. Websockets (Live Server-Client Verbindungen um eine dauerhafte Verbindung zu haben, sodass der Server z.B. events schicken kann).

    Ich hab vermutlich noch einiges Vergessen.

    Nachdem Microsoft den Internet Explorer eingestellt hat, gibt es eig. nur noch 3 Browser. Firefox, Google Chrome und Safari. Fast alle anderen aktuellen Browser verwenden die Chrome-Engine und bauen ihr eigenes Zeug drum herum (was der einzige Ansatz wäre, der für dich überhaupt möglich sein könnte).

    Es gibt Gründe, warum große Teams an aktuellen Browsern entwickeln (die schon seit Jahren bestehen) und Microsoft mit Edge mittlerweile auch die Chrome-Engine nutzt, statt einen eigenen Browser zu entwickeln. Der Internet Explorer ist was neue Features,... anging auch nicht mehr wirklich mitgekommen.

    Mit AutoIt wirst du dabei ebenfalls nicht weit kommen, da die Performance einfach nicht ausreicht.

    Ich hoffe es ist verständlich geworden, dass dein Vorhaben viel zu komplex und nahezu unmöglich ist.

    Außerdem hoffe ich, dass auf dem PC, den du ja scheinbar nutzt um im Internet zu surfen, nichts wichtiges ist und alle anderen Geräte in einem anderen Netzwerk hängen. Keine aktuelle Browser-Version zu nutzen bedeutet, dass dein PC ohne Schwierigkeiten von jeglicher Webseite vollkommen übernommen werden kann. Kritische Lücken, die die Übernahme des PCs ermöglichen werden oft gefunden, schnell behoben und sollten schnell installiert werden (Firefox ist mittlerweile bei Version >100.

    Browser sind so ziemlich das anfälligste Element auf deinem Computer, weil sie aktiv Verbindungen zu allen möglichen Servern herstellen. Andere Software meist nur zu spezifischen Servern, bzw. müssen sie erstmal durch die Firewall.

    Du solltest WinXP und/oder einen veralteten Browser DEFINITIV nicht mehr nutzen um aktiv im Internet unterwegs zu sein (wo Cookie Banner stören könnten).

    Und solche Meldungen kommen alle paar Wochen:

    Firefox 02.06.22: https://www.heise.de/news/Schwachst…et-7129671.html

    Chrome: 25.0.5.22: https://www.heise.de/news/Webbrowse…en-7122031.html

    Achja, weil ichs grad nochmal gesehen hab:

    Zitat von PSblnkd

    Neuerdings kommt noch ein weiteres Problem hinzu. Von meinem eMail-Provider bekam ich die Mitteilung, daß ich mit meinem eMail-Programm "Outlook-Express" demnächst keinen Zugriff mehr haben werde, weil dieses die neuen Verschlüsselungs-Technologien TLS 1.2 nicht unterstützt.

    Man muß sich also andauernd um solche "Belanglosigkeiten" kümmern, als mit der eigentlichen Arbeit beschäftigt zu sein.

    => AUS GUTEM GRUND

    JEDER, der sich zwischen deinem PC und dem E-Mail Server befindet, von deinem Router, deinem Internetanbieter und jedem anderen Knoten-Punkt, der den Webtraffic zu deinem E-Mail-Server weiterleitet, kann auf deine Zugangsdaten, wie Benutzername und Passwort, zugreifen und alle Emails mitlesen und sich mit den Zugangsdaten als DU ausgeben und für dich E-mails schreiben.

    Solange du nicht in einem komplett getrennten System unterwegs bist, sind Updates sehr wichtig. Deshalb sollte alte Software, die auf neuen Systemen nicht funktioniert, ausschließlich in VMs (oder dedizierten Maschinen nur dafür) ausgeführt werden und keinen Internetzugriff mehr haben.


    Mit freundlichen und besorgten Grüßen,

    Kanashius.

  • Status von Fingerabdruckscanner (Windows Hello) ermitteln

    • Kanashius
    • 11. Mai 2022 um 14:02

    Es ist keine Manipulation, wenn das Betriebssystem nach Authorisierung gefragt wird, der Finger gescannt wird und das Betriebssystem dann mitteilt, dass die Authorisierung erfolgreich war.

    So funktioniert es auf jedenfall bei Android. Die Anwendung speichert keine Fingerabdrücke, sondern das Betriebssystem (wobei auch nicht der Fingerabdruck direkt, sondern nur die Punkte, wo Vertiefungen sich treffen,... gespeichert werden und diese dann beim Scannen verglichen werden, indem geprüft wird, ob die Abstände zwischen den Punkten ähnlich sind,... Falls die Details interessant sind ;) ) .

    Dabei können dann natürlich nur die Fingerabdrücke, die für den eingeloggten Account registriert sind, überprüft werden.

    Hab grad mal kurz gesucht: https://docs.microsoft.com/en-us/windows/…rosoft-passport
    Es geht also, es wird vmtl. nur (noch) keine UDF für AutoIt geben.

    MfG Kanashius.

  • Abfrageergebnisse in Datei/Datenbank schreiben/lesen

    • Kanashius
    • 24. Januar 2022 um 15:38

    https://www.sqlite.org/lang_update.html =>

    SQL
    UPDATE Rechnerinformationen SET IP-Adresse="127.0.0.0", "Uptime"="2022/01/17 07:15:55" WHERE Rechnername="WDEST1987"

    Ich würde dir auch empfehlen, keine Leerzeichen/Sonderzeichen in Spaltennamen zu verwenden ("letzter Neustart"/"IP-Adresse"...) Das könnte später Probleme machen.
    Dann kann man Spaltennamen ohne "" verwenden und besser von wirklichen Daten unterscheiden und - wird auch als Minus operator verwendet => SELECT IP-Adresse FROM XX könnte also auch als subtrahiere Spalte IP von Adresse und geb das zurück heißen.

    Allgemein ist es Standard mit CamelCase oder _ zu schreiben, also: ip_adresse oder ipAdresse

  • Einfache Frage zum Vergleich von Variablen

    • Kanashius
    • 12. Januar 2022 um 09:51

    Nur noch als Anmerkung:

    Wenn du viele Werte vergleichen willst macht es evtl. Sinn ein Array zu verwenden.

    AutoIt
    $arVars=['a', 'a', 'a', 'a']
    
    if NOT _checkAllSame($arVars) then
        MsgBox(48,"","Not same")
    else
        MsgBox(48,"","All same")
    endif
    
    Func _checkAllSame($arVars)
        local $sCheck=$arVars[0]
        For $i=1 to UBound($arVars)-1 step 1
            If NOT $arVars[$i] = $sCheck Then return false
        Next
        return True
    EndFunc
    Alles anzeigen

    Dann musst du nur alle Werte ins Array schreiben und das könnte einiges an Code ersparen.

  • Formel noch nicht gefunden : Ich liebe Menschen die nicht einmal für eine Krone mit denken (mitdenken ?) !

    • Kanashius
    • 31. Dezember 2021 um 14:26

    Das wirst du mit den Informationen nicht ausrechnen können. Du kennst das verhältnis von F vs A in DK und D ja nicht...

    Kann ja sein, dass alle A in DK waren und F verteilt oder so.

  • Audio-Programmierung mit DirectX

    • Kanashius
    • 8. Dezember 2021 um 13:43

    Ich weiß jetzt nichts von einer UDF für DirectX, aber ich habe selbst schon die BASS UDF verwendet. Die ermöglicht alles, was du genannt hast und noch vieles mehr.

    BASS Function Library (Sound and Music Functions)
    BASS Function Library This library is a wrapper for the powerful Bass.DLL and add-ons (which increase the functionality of Bass.DLL). Bass.DLL is ideal for use…
    www.autoitscript.com

    Un4seen Developments

    DirectX ist ja nicht wirklich ein WindowsAddOn, sondern ein Framework zum Entwickeln von Spielen. Da ist auch Audio dabei, ich denke aber nicht, dass Audio/Audio bearbeitung der Hauptfokus dabei war.

  • Modalfenster (Lightbox) / runde Ecken / Schlagschatten

    • Kanashius
    • 18. November 2021 um 19:11

    Ich hab das ganze Script mal überarbeitet und einiges ausgebessert.

    Also:

    1. Erstelle Controls wenn möglich direkt mit dem Fenster und ändere nur den Inhalt/State später. (Neben $GUI_DISABLE gibt es auch $GUI_HIDE). Dabei hab ich auch gleich die Größe dynamischer gestaltet => Einfach die Variablen über der Gui ändern und alle Controls ändern die Größe entsprechend. Wenn es mehr Controls werden ist das Gold wert.

    Normalerweise braucht es bei einem Login auch keiner Anleitung, was als nächstes zu tun ist... deshalb hab ich die mal rausgenommen. Die Information welcher User ausgewählt wurde muss auch nicht extra als Label dazukommen... Der User hat es ausgewählt und SIEHT was er ausgewählt hat. Es ist halt nur fürs debugging für dich interessant und sollte deshalb temporär mit dem ConsoleWrite/MsgBox ausgegeben werden. (Außer du hast es mit Menschen zu tun, die noch nie einen Computer gesehen haben... dann könnte es sinn machen).

    2. Die Nutzer in einem Array speichern. Dadurch kannst du mit 1ner Zeile später Nutzer hinzufügen,... ohne die ganzen Funktionen,... zu erstellen. Zumal der Code immer gleich war. Merke: Wenn du mehrmals fast exakt den gleichen Code hast, dann solltest du ein Array/eine Funktion dafür benutzen.

    3. Es wäre extrem unsicher, die Passwörter der Nutzer direkt in der Anwedung zu speichern. Wenn das unbedingt notwendig ist, speicher zumindest nur hashes. Also: Wenn ein neuer Nutzer dazukommt einfach in der Region: Generate passwordhash... die Zeilen auskommentieren und die passwörter eintragen, hashes generieren lassen und diese mit dem salt in das array $arUsers speichern. Danach UNBEDINGT die passwörter wieder aus der Region entfernen. (Alternativ einfach die passwörter als commandlineargument beim start übergeben, keine Ahnung, wie gut du dich mit so etwas auskennst.)

    Hintergrund: Man kann die .exe am ende mit einem Texteditor öffnen und die Passwörter rauslesen. Mit hashes wird es sehr viel schwieriger (und extremst rechenintensiv) => fast unmöglich für normale nutzer und auch für experten zumindest sehr schwer. Falls dich das Thema interessiert such einfach mal nach "Passwörter sicher speichern" und hashes, dann wirst du schnell fündig.

    AutoIt
    #include <AutoItConstants.au3>
    #include <ColorConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <FontConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPISys.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIHObj.au3>
    #include <WindowsConstants.au3>
    #include <misc.au3>
    #include <array.au3>
    #include <Crypt.au3>
    
    #Region ; Script Kopf
        #cs ----------------------------------------------------------------------------
    
            Script Function:     Diese Script soll bei der Windowsanmeldung, bzw. von Hand gestartet werden können.
                                Die Aufgaben sollen sein:
                                - Benutzer via Dropdownbox auswählen
                                - Passwort eingeben
                                - Passwort überprüfen
                                - Wenn Passwort OK, dann ...
                                - verschiedene Netzwerklaufwerke auf der NAS verbinden
                                - verschiedene Outlook Profile mit dem jeweiligen Benutzer verbinden
                                - Optional: Protokolldatei schreiben, wer sich wann angemeldet hat
                                - Optional: Überlegung was passiert beim sperren oder Logout Prozess von Windows.
    
            Erstellungendatum:    17.11.2021 - Start
    
            Änderungsdatum:
    
            Version: 0.0.0.*
    
            History:
    
            0.0.0.*: Entwicklungsphase
            1.0.0.0: Initialerstellung
    
            Info: Passwörter werden in der Globale Variablendeklaration gesetzt
    
    
        #ce ----------------------------------------------------------------------------
    #EndRegion ; Script Kopf
    
    #Region ; Generate passwordhash with commandline (Maybe put the code in a different program)
    ; ReDim $CmdLine[4]
    ; $CmdLine[0]=3
    ; $CmdLine[1]="CoolPasswordToHash"
    ; $CmdLine[1]="OtherCoolPasswordToHash"
    
    If Ubound($CmdLine) > 1 Then
        _Crypt_Startup()
        For $i=1 To UBound($CmdLine)-1 Step 1
            $sSalt = __Crypt_GenerateSalt(12)
            $sHash = _Crypt_HashData($CmdLine[$i]&$sSalt, $CALG_SHA_256)
            ConsoleWrite("Hash "&$i&": "&$sHash&" SALT: "&$sSalt&@crlf)
        Next
        _Crypt_Shutdown()
        exit
    EndIf
    #EndRegion ; Globale Variablendeklaration
    
    #Region ; AutoIt-Spezifischen Optionen
    
        Opt("GUICloseOnESC", 1) ; Wenn man die ESC Taste drückt, wird die GUI geschlossen, da eine $GUI_EVENT_CLOSE Nachricht gesendet wird
        Opt("MustDeclareVars", 1) ; Variablen (Dim / Global / Local / Const) müssen deklariert sein. Wichtig für Fehlersuche
        Opt("TrayIconDebug", 1) ; Zeigt die aktuelle Skriptzeile im Trayicon Tipp um das Debugging zu unterstützen
        Opt("WinTitleMatchMode", 2) ; 1=vom Anfang, 2=enthält, 3=genau, 4=fortgeschritten, -1 bis -4=Groß-/Klein ignorieren
    
    #EndRegion ; AutoIt-Spezifischen Optionen
    
    #Region ; Globale Variablendeklaration
        Global $iMsg, $hGUI, $hGUIMain, $hGUILogin, $idComboBox, $sComboRead = "", $sPassword, $sPasswortCheck
        Global $sFileVersion = FileGetVersion(@AutoItExe)
        Global $arUsers = [ _ ; USERNAME ; PASSWORDHASH ; SALT
                ["BenutzerA", "0xAAA79A151040DE772FB6D807C1CC554AA2F300C3D9D75362CE51B850708E6365", "vsaAOMmDiwBvP"], _
                ["BenutzerB", "0x9AAE126ECFC48AEDBE436C4AD29E703E7AD8429C77DEDECD0012E7298560F345", "FE3yRGBA1Emlv"], _
                ["Mitarbeiter", "0x4F179B63ADFB8DAF1BB66FF84BFA214C4CD72A4A83AEA14062E7DF91C80B4A21", "h1COZUA2FtfV5"] _
            ]
    #EndRegion ; Globale Variablendeklaration
    
    #Region ; GUI Erstellung
        Global $iGuiMainWidth = @DesktopWidth, $iGuiMainHeight = @DesktopHeight
        $hGUIMain = GUICreate("", $iGuiMainWidth, $iGuiMainHeight) ; Das Hauptfenster wird erstellt
        GUISetState(@SW_MAXIMIZE, $hGUIMain) ; Hauptfenster maximieren, damit der Rand besser ausschaut
        GUISetBkColor(0x4d4d4d)  ; Ändert die Hintergrundfarbe in ein grau
        GUISetState(@SW_SHOW, $hGUIMain) ; Das Hauptfenster neu aufbauen
    
    
        Global $iGuiLoginWidth = 550, $iGuiLoginHeight = 200, $iGuiLoginSpaceLeft = 30, $iGuiLoginSpaceRight = 30, $iGuiLoginWidthWithoutSpace = $iGuiLoginWidth - $iGuiLoginSpaceLeft - $iGuiLoginSpaceRight
        $hGUILogin = GUICreate("    Login - Firma Reik Raumausstattung", $iGuiLoginWidth, $iGuiLoginHeight, Default, Default, Default, Default, $hGUIMain)  ; Das davor liegende Childfenster wird erstellt
        GUISwitch($hGUILogin) ; Das Childfenster wird zum aktuellen Fenster angewendet, damit dort GUI Funktionen angewendet werden können.
        GUISetBkColor(0x680000)  ; Ändert die Hintergrundfarbe in ein rot
        GUICtrlCreateLabel("Bitte wähle Deinen Benutzer aus:", $iGuiLoginSpaceLeft, 10, $iGuiLoginWidthWithoutSpace) ; Beschreibender Text erstellen
        GUICtrlSetColor(-1, 0xFFFFFF) ; Setzt die Schriftfarbe auf weiss
        GUICtrlSetFont(-1, 12)
    
        $idComboBox = GUICtrlCreateCombo("", $iGuiLoginSpaceLeft, 50, $iGuiLoginWidthWithoutSpace) ; Dropdown Menü erstellen
        GUICtrlSetFont(-1, 10)
        Local $sUsers=""
        For $i=0 to UBound($arUsers)-1 step 1
            If not $sUsers = "" Then $sUsers&="|"
            $sUsers&=$arUsers[$i][0]
        next
        GUICtrlSetData($idComboBox, $sUsers)
    
        Global $idLabelPasswordResponse=GUICtrlCreateLabel("", $iGuiLoginSpaceLeft, 150, $iGuiLoginWidthWithoutSpace, 25) ; Schreibe erfolgreiche Passworteingabemeldung
        GUICtrlSetFont(-1, 12)
        GUICtrlSetColor(-1, 0xFFFFFF)
    
        GUICtrlCreateLabel("Passwort:", $iGuiLoginSpaceLeft, 90, $iGuiLoginWidthWithoutSpace) ; Schreibe Passwort
        GUICtrlSetFont(-1, 12)
        GUICtrlSetColor(-1, 0xFFFFFF) ; Setzt die Schriftfarbe auf weiss
    
        Global $idInputPassword = GUICtrlCreateInput("", $iGuiLoginSpaceLeft, 120, $iGuiLoginWidthWithoutSpace, Default, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL)) ; Inputfeld für Passwort
        GUICtrlSetFont(-1, 12)
        GUICtrlSetColor(-1, 0x000000) ; Setzt die Schriftfarbe auf weiss
        GUICtrlSetState($idInputPassword, $GUI_DISABLE)
    
        GUISetState(@SW_SHOW, $hGUILogin)  ; Das Childfenster neu aufbauen
    
    #EndRegion ; GUI Erstellung
    
    #Region ; Hauptschleife
        $iMsg = 0
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                Case $idComboBox
                    GUICtrlSetState($idInputPassword, $GUI_ENABLE)
            EndSwitch
    
            If _IsPressed("0D") and WinActive($hGUILogin) Then ; Check if ENTER was pressed and the Login window is currently active
                _tryPassword(GUICtrlRead($idComboBox), GUICtrlRead($idInputPassword))
            EndIf
    
        WEnd
        GUIDelete($hGUI) ; schließe die GUI
    #EndRegion ; Hauptschleife
    
    Func _tryPassword($sUser, $sPassword)
        ; search the user array for the index of the user
        Local $iUserIndex=-1
        For $i = 0 to UBound($arUsers)-1 Step 1
            If $arUsers[$i][0] = $sUser Then
                $iUserIndex=$i
                ExitLoop
            EndIf
        Next
        If $iUserIndex=-1 Then ; user not found
            GUICtrlSetData($idLabelPasswordResponse, "Der Nutzer """&$sUser&""" konnte nicht gefunden werden!")
            return false
        EndIf
        If _checkPassword($sPassword, $arUsers[$iUserIndex][1], $arUsers[$iUserIndex][2]) Then ; password correcty
            GUICtrlSetData($idLabelPasswordResponse, "Das Passwort wurde korrekt eingegeben. Login wird fortgesetzt ...")
            return true
        Else ; password wrong
            GUICtrlSetData($idLabelPasswordResponse, "Das Passwort war nicht korrekt. Bitte nochmals probieren!")
            return false
        EndIf
    EndFunc
    
    Func _checkPassword($sPassword, $sHash, $sSalt)
        return _Crypt_HashData($sPassword&$sSalt, $CALG_SHA_256) = $sHash
    EndFunc
    
    Func __Crypt_GenerateSalt($length)
        Local $sChars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        Local $arChars=StringSplit($sChars,"", 1+2)
        Local $sSalt=""
        For $i=0 to $length Step 1
            $sSalt&=$arChars[Random(0,UBound($arChars)-1, 1)]
        Next
        return $sSalt
    EndFunc
    
    Func _02_Steuerung($sBenutzer)
        _03_Laufwerke($sBenutzer)
        _04_Outlook()
    EndFunc   ;==>_02_Steuerung
    
    Func _03_Laufwerke($sBenutzer) ; Benutzerlaufwerke managen
        ; Verbindungen trennen
        GUICtrlCreateLabel("Loginscript von " & $sBenutzer & " wird gestartet", 150, 310, 400) ; Schreibe erfolgreiche Passworteingabemeldung
        GUICtrlSetFont(-1, 12)
        GUICtrlSetColor(-1, 0xFFFFFF)         ; Setzt die Schriftfarbe auf weiss
        GUISetState(@SW_SHOW, $hGUILogin)         ; Das Childfenster neu aufbauen
    
        ; Laufwerke löschen - eventuell vorher Anwendungen schließen, die auf diese Laufwerke zugreifen.
    
        ; Kontrolliern ob Sie gelöscht sind
    
        ; Laufwerke neu mappen
    
    EndFunc   ;==>_03_Laufwerke
    
    Func _04_Outlook() ; Outlookprofile managen
    
    EndFunc   ;==>_04_Outlook
    Alles anzeigen

    Edit: Fix mistake Line 136 using #sPasswort instead of the control $idInputPassword

  • Modalfenster (Lightbox) / runde Ecken / Schlagschatten

    • Kanashius
    • 18. November 2021 um 15:25

    Ja, das hast du richtig erkannt. In Windows ist ein Child-Window über dem Parent und kann auch dafür genutzt werden, das Parent unbenutzbar zu machen, sodass das Child erst geklickt werden muss, bevor das Parent wieder funktioniert (z.B. für error-meldungen,...).

    Ich vermute mal, dass das Child das WinSetOnTop vom Parent erbt und weiterhin über dem Parent bleibt, hab das aber noch nie probiert^^.

    Evtl. interessant: Controls sind oft auch Child-Windows, die in dem Parent platziert sind.

  • Sprachbot für Discord

    • Kanashius
    • 17. November 2021 um 19:06

    Ich würde dir Empfehlen statt AutoIt einfach mit VirtualAudioCable (https://vac.muzychenko.net/en/) ein virtuelles Mikrofon+Lautsprecher zu erstellen. Dabei nimmst du dann in Soundplay das virtuelle Gerät als Audioausgang (Ab Win10 kannst du auch das Standardausgabegerät für einzelne Programme ändern, falls Soundplay das nicht unterstützt) und im Discord das virtuelle Gerät als Mikrofon.

    Diese virtuellen Geräte haben den Vorteil, dass sie verknüpft sind und alles, was in den Lautsprecher gesendet wird als Mikrofon Input verwendet wird. Das ist sonst meist nicht so einfach möglich.

    Wenn du dann mit dem selben Discord Nutzer noch dein normales Mikrofon gleichzeitig wiedergeben möchtest kannst du das, indem du unter "Sound" unter den Aufnahmegeräten dein Mikrofon auswählst und unter "Listen" (Zuhören?) -> playback through this device (Keine Ahnung wies im Deutschen Windows heißt; ist das einzige Dropdown Menü dort) das virtuelle Gerät wählen.

    Ansonsten ist es sehr schwer, die Audioausgabe von anderen Programmen als Mikrofon zu verwenden. Du kannst natürlich immernoch mit AutoIt die Ausgabe empfangen, verarbeiten und an ein weiteres virtuelles Gerät senden. Dabei würde ich dir dann empfehlen, dir die BASS UDF einmal genauer anzuschauen.

    MfG Kanashius.

  • Variablen in SQLite schreiben (INSERT)

    • Kanashius
    • 13. November 2021 um 21:05

    Ja, das erste Codebeispiel war nur zum zeigen und noch keine Lösung.

    Ich hab beim zweiten nicht ganz aufgepasst. Also: Es ist schon alles richtig, was ich betreffend der Strings erklärt habe, aber bei SQL statements gibt es noch eine Besonderheit.

    Auch die Datenbank muss wissen, dass du dort einen String (bzw. bei SQLite TEXT) übergibst.

    So wie du in AutoIt einen String angibst, indem du ihn mit " umschließt (nebenbei: wenn du " in einem String haben möchtest kannst du das mit verdoppelung erreichen, dementsprechend wird bei $sData="Dies ist ein ""cooler"" Text" das cooler in Anführungszeichen stehen.),

    musst du bei SQL auch zeigen, dass es ein String ist. Das geht, indem du dort ' oder ` verwendest.

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values (`" & $Vorname & "`, `" & $Name & "`, `" & $Telefon & "`)")

    Vorher wusste SQLite nicht, dass das ein String sein soll und hat stattdessen nach der Spalte mit dem Namen Holger gesucht, anstatt den String `Holger` in die Tabelle einzufügen. => no such column: Holger

    Die Query muss also so aussehen: INSERT INTO Tabelle (Name, Vorname, Summe) Values (`Holger`, `Esseling`, `99874`)

    P.S.: Mit Code ist es schon richtig, das hab ich auch verwendet. Wwenn du den Quellcode nach dem einfügen nochmal anklickst kannst du oben als Syntax-Hervorhebung AutoIt auswählen, dann wird der Code auch farbig hervorgehoben.

  • Variablen in SQLite schreiben (INSERT)

    • Kanashius
    • 13. November 2021 um 17:25

    Hallo :)

    Alles zwischen den " (double quotes) wird als String gewertet.

    Es ist also ab dem Moment kein Code mehr, sondern einfach nur Text, der in eine Variable (den Arbeitsspeicher) gespeichert werden soll. Hier wird nicht direkt eine Variable angelegt, sondern der String direkt an die Funktion übergeben.

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values ($Vorname, $Name, $Telefon)")
    ; und
    local $sInsertStatement = "INSERT INTO Tabelle (Name, Vorname, Summe) Values ($Vorname, $Name, $Telefon)"
    _SQLite_Exec($DB, $sInsertStatement)

    ist also (fast) das gleiche. Es ist ja auch sinnvoll, denn wenn du in einem String z.B. den Text $Vorname verwenden willst, geht das nicht mehr. Deshalb musst du im Code sagen, dass du an der Stelle nicht den Text "$Vorname", sondern die Variable verwenden willst.

    In AutoIt wird das meistens gemacht, indem mehrere Strings genommen und zusammengefügt werden:

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values (" & $Vorname & ", " & $Name & ", " & $Telefon & ")")

    Hier wird der String hinter "Values (" beendet und die Variable $Vorname angehängt. Dann wird der String ", " angehängt, usw.

    & ist der Operator (wie + für addition) um Strings, bzw. Variablen hintereinander als Text zusammenzufügen.

    Eine andere Möglichkeit wäre StringFormat. Dabei ist es möglich die Variable zu formatieren. Es wird zb. mit %s ein String angegeben, der dann später durch den Inhalt der Variable ersetzt wird. Dabei können z.b. Dinge angegeben werden, wie die Länge der Variable soll mindestens 10 Zeichen sein, und wenn welche fehlen, werden Leerzeichen davor eingefügt uvm. Am besten kannst du dir dazu die Hilfe zu StringFormat durchlesen.

    AutoIt
    local $sVorname="Max", $sName="Mustermann", $sTelefon="1023734634"
    ConsoleWrite("INSERT INTO Tabelle (Name, Vorname, Summe) Values (" & $sVorname & ", " & $sName & ", " & $sTelefon & ")"&@crlf)
    ConsoleWrite(StringFormat("INSERT INTO Tabelle (Name, Vorname, Summe) Values (%s, %s, %s)", $sVorname, $sName, $sTelefon)&@crlf)
    
    local $arNames=[["Max","Mustermann"],["Test","Other"],["Names","Multiple"],["Example","Names"],["Other","Name"]]
    ConsoleWrite(StringFormat("% 10s % 10s)", "Vorname", "Nachname")&@crlf)
    for $i=0 to UBound($arNames)-1 step 1
        ConsoleWrite(StringFormat("% 10s % 10s", $arNames[$i][0], $arNames[$i][1])&@crlf)
    next

    MfG, Kanashius.

    Edit: Schaut aus als ob das einfügen von Code mit dem "Inline-Code"-Button eine schlechte Idee ist.

  • Alternative zu "Sleep"

    • Kanashius
    • 31. Oktober 2021 um 12:00

    Was heißt denn für dich "vollständig gestartet"?
    Wenn du auf ein Fenster warten willst: WinWait

    Wenn du warten willst, bis das Programm fertig ist: RunWait

  • Kombination von Tastatureingaben richtig abfangen

    • Kanashius
    • 14. Mai 2021 um 18:19
    Zitat von Moombas

    Sieht aus als würde jemand versuchen mit einer Tastatur, die keine Umlaute hat (z.B. EN-Layout), diese über einen Umweg zu simulieren.

    Ich würde empfehlen, ein eigenes Layout zu erstellen. Das sollte deutlich einfacher/sinnvoller sein, wenn dies tatsächlich das Ziel ist.

    Ich nutze ebenfalls eine Tastatur mit US-Layout und kann nur empfehlen, das International Layout ohne DEAD Keys zu verwenden.

    Ansonsten kann man mit dem Tool "Keyboard Layout Creator" von Microsoft nen eigenes Layout erstellen.

    MfG, Kanashius.

  • Speicheranzeige

    • Kanashius
    • 11. Mai 2021 um 13:31

    pasted-from-clipboard.png

    Der Ressourcenmonitor ist dort auch etwas unterschiedlich. Meine Vermutung wäre, dass der Taskmanager eventuell nur die absolute Arbeitsspeicher Nutzung anzeigt, nicht aber, wenn Daten in den swap ausgelagert werden. Normal passiert das ja nur, wenn der Arbeitsspeicher zu wenig wird, teilweise wird das aber auch mit Teilen der benötigten Ressourcen gemacht, welche nie genutzt werden.

    Aber wenn es dir darum geht, memory leaks zu finden würde ich einen anderen Ansatz nehmen:
    Alles durchschauen, ob man selbst Arbeitsspeicher allociert und nicht wieder freigibt. Wenn dort alles ausgeschlossen werden kann würde ich als nächstes UDFs verdächtigen und zu guter letzt AutoIt selbst (da kann man nur leider dann nichts mehr machen) ;)
    Im zweifel das Programm in Abschnitte aufteilen (normalerweise hat man ja eh viele funktionen,...) die einzeln getestet werden können und diese dann härtetests unterziehen => Sehr oft ausführen und die Arbeitsspeichernutzung ansehen.

    MfG Kanashius

  • Wortanfang Schreibweise

    • Kanashius
    • 24. April 2021 um 16:37

    Ich würde einen anderen Ansatz nehmen.

    Es gibt dictionary files. Mit diesen würde ich alle Worte im text lowercase vergleichen und dann das passende Wort nehmen.

    Dementsprechend mit dem dictionary file, was ich für ein Wortfinde/Buchstabensalatpuzzle nutze (ca. 1,7 millionen worte) kann man das recht gut umsetzen:

    Auszug aus dem dictionary:

    Spoiler anzeigen

    Kaufladen

    Kaufläden

    Kaufladenartikel

    Kaufladenartikeln

    Kaufladenartikels

    Kaufladens

    Kaufland

    Kauflandes

    Kauflandsporthalle

    Kauflandsporthallen

    Kauflaune

    Kaufleute

    Kaufleuten

    Kaufleutesiedlung

    Kaufleutesiedlungen

    Dann den Code etwa so:

    - Satz in Wörter splitten

    - Für jedes Wort: lowercase vergleich des Wortes mit dem Dictionary, wenn es gefunden wird das original Wort aus dem Dictionary eingefügt, ansonsten mit dem Ansatz, den du hast das Wort anpassen.

    (Ich weiß grad nicht mehr, wo ich das dictionary her habe, ich hatte ne weile gesucht. Wenn du es haben möchtest kann ich dir nen Link per PM schicken)

    Ich würde aber aus performance gründen eher nicht AutoIt verwenden. In dem Wortfindepuzzle dauert es mit Java etwa 1-2 Minuten, wenn ich ein 50x50 feld mit 1000 zufälligen, unterschiedlichen Wörtern mit mind. länge 3 füllen will. (8 Richtungen; horizontal, vertikal und diagonal, vorwärts und rückwärts) Ich will nicht wissen, wie lange AutoIt dafür brauchen würde, da dabei jede mögliche Position für jedes zufällige Wort in zufälliger Reihenfolge durchgegangen wird, ob es irgendwo hinpasst; solange, bis die X Wörter untergebracht sind oder alle Wörter durchgegangen wurden.

    MfG Kanashius

  • Anfängerfrage -> Mausklick simulieren ohne Pos

    • Kanashius
    • 19. April 2021 um 22:28

    Ich hab mal reingeschaut. Ich weiß nicht, ob du den Zugang zur API mitgebucht hast, aber wenn ja ist das der einfachste und sicherste weg, damit auch nichts schief geht.

    Mit https://app.billbee.io//swagger/ui/in…t_ShipWithLabel kann man das Gewicht setzen und mit https://app.billbee.io//swagger/ui/in…ateDeliveryNote das PDF für die Auslieferungsnachricht anfordern.

    Ich schätze, das sind die beiden Aufrufe, die du brauchst.

    Authentifizierung schaut auch sehr einfach aus:

    • "Contain a valid API Key identifying the application/developer. It has to be sent as the HTTP header X-Billbee-Api-Key" => HTTP Header mit X-Billbee-Api-Key und dem key als value
    • Contain a valid user login with billbee username and api password in form of a basic auth HTTP header => Authorization mit Basic auth

    Beispiel:

    X-Billbee-Api-Key: <your api key>

    Authorization: Basic AXVubzpwQDU1dzByYM==

    AXVubzpwQDU1dzByYM== ist der Base64 string von "username:Pa$$w0rd"

    Du musst dann die URLs die beim Link angegeben wurden mit ! https ! aufrufen und die geforderten JSON daten übergeben.

    So ähnlich dürfte der Code dann aussehen.

    AutoIt
    Global $user="username", $password="passwort", $API_KEY="API-Key", $api_url="https://app.billbee.io/api/v1"
    
    
    $sJsonShipmentWithLabel='{' _
                '"OrderId": 0,' _
                '"ProviderId": 0,' _
                '"ProductId": 0,' _
                '"ChangeStateToSend": true,' _
                '"PrinterName": "string",' _
                '"WeightInGram": 0,' _
                '"ShipDate": "2021-04-19T20:03:49.719Z",' _
                '"ClientReference": "string",' _
                '"Dimension": {' _
                    '"length": 0,' _
                    '"width": 0,' _
                    '"height": 0' _
                '}' _
            '}"'
    $result=_callApi($api_url&"/api/v1/shipment/shipwithlabel", $sJsonShipmentWithLabel)
    
    Func _callApi($sUrl, $sJson)
        local $oHTTP=ObjCreate("WinHttp.WinHttpRequest.5.1")
        $oHTTP.Open("POST", $sURL, False)
        If @error Then Return SetError(1, 0, 0)
        $oHTTP.SetRequestHeader("X-Billbee-Api-Key", $API_KEY)
        $oHTTP.SetRequestHeader("Authorization", "Basic "&_base64($user&":"&$password))
        $oHTTP.Send($sJson)
        If @error Then Return SetError(2, 0, 0)
        If $oHTTP.Status <> 200 Then Return SetError(3, 0, 0)
        Return SetError(0, 0, $oHTTP.ResponseText)
    EndFunc
    Alles anzeigen

    MfG Kanashius.

  • Umfrage: Welchen Shortcut bevorzugst du für "Redo"?

    • Kanashius
    • 6. April 2021 um 13:48

    Ich hab für beides gestimmt. Mit deutschem Layout ist STRG+SHIFT+Z grauenvoll, aber im US-Layout (was ich mittlerweile benutze) ist es echt angenehm.

    US layout ist eher zum Programmieren geeignet (zeichen wie {}[],... sind einfacher zu erreichen und das ist echt angenehm) und deshalb bin ich gewechselt, unter anderem aber auch, weil Intellij die Belegung anders hat:

    Zitat


    The default IntelliJ / Android Studio "Redo" action shortcut is CTRL + Shift + Z and this is a common problem for Windows users. A bigger problem is CTRL + Y is mapped to the "Delete line" action - and this causes the undo stack to be lost.

    Das Problem hatte ich schon öfter und es hat mich jedesmal genervt... :D

  • übersetzer programmieren

    • Kanashius
    • 15. März 2021 um 20:44

    Ich kann mich Musashi da nur anschließen.

    Übersetzungen sind nicht leicht, besonders mit vielen verschiedenen Bedeutungen. Die Probleme erkennt man sehr schön, wenn man sich die Videos anschaut, wo Text mehrfach durch einen Übersetzer geschickt werden und am Ende ein komplett anderer Text herauskommt.

    Sprachen sind nicht eindeutig, sondern Kontextabhängig. Je nachdem, welche Wörter zusammen vorkommen, wie sie angeordnet sind,... kann sich alles ändern.

    Du kannnst es vielleicht hinbekommen, mit Wortdatenbanken Wörter zu übersetzen/ersetzen und dir dann daraus (als Person) den Sinn des Satzes ableiten, aber wie gut das am Ende aussieht, wage ich zu bezweifeln, insbesondere, wenn du mit den existierenden Programmen nicht zufrieden bist... ich bezweifle etwas, dass dein Programm das Level dieser Programme erreicht, wenn du noch Anfänger bist. (Das schließe ich mal daraus, dass du mit Kodi eine Oberfläche zusammenbaust und erwähnst, dass du den Text in eine Variable bekommst...)

    Außerdem ist AutoIt definitiv nicht die Programmiersprache, mit der du ein solches Vorhaben umsetzen möchtest.

    Zum Übersetzen wird einiges an Leistung benötigt, da es so komplex ist und so viel Berücksichtigt werden muss. Da ist eine Scriptsprache definitiv kein guter Ansatz.

  • Brauche Unterstützung bei AutoIt

    • Kanashius
    • 10. März 2021 um 19:17

    Da sich der Code gerade dahin entwickelt, dass sehr viel Copy&Paste Code (Code duplicates) vorkommen, danchte ich, ich überarbeite den Code einmal vollständig und zeige dabei einige Konzepte, die ich empfehlen würde um den Code einfach und Wartbar zu halten.

    Zum einen sollten unbedingt Arrays verwendet werden, um immer denselben code zu vermeiden (siehe z.B. Zeile 58-67 und 69-80 oben). Dort wird derselbe Code verwendet, das einzige was sich verändert sind die Daten in den Textfeldern => Die Daten in ein Array und es muss nurnoch eine Test1/Test2 Funktion erstellt werden und dementsprechend auch nur eine Funktion verändert werden.

    Falls du arrays noch nicht kennst: Unbedingt anschauen, sie bilden das Grundkonzept jeglicher dynamischer Programmierung in AutoIt. (Gutes Tutorial von BugFix : http://www.bug-fix.info/array_tut.htm)

    Bei meinen Modifikationen hab ich auch gleich Variablen zur Fenster-Erstellung genutzt. Dadurch kann z.B. die Fenstergröße oben in der Variable geändert werden und alle Controls,... passen immernoch zum Fenster.

    Schau die das Programm am besten in Ruhe an, ich denke, du kannst dabei einiges/einige Konzepte lernen.

    AutoIt
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <GuiComboBox.au3>
    #include <Array.au3>
    
    Global $iKB=1000,$iMB=$iKB*1000,$iGB=$iMB*1000,$iTByte=$iGB*1000
    
    ; Alle größen um das Fenster zu erstellen. Durch das Nutzen der Variablen kann man jede Größe ändern und alles passt sich an und es müssen nicht immer alle Positionen der anderen Controls angepasst werden.
    ; (Macht das Ändern des Designs leichter und kann dabei viel Arbeit sparen.)
    Global $iWidthGuiMain=400,$iHeightGuiMain=200, $iControlHeight=25, $iControlSpace=5, $iControlCalcHeight=$iControlHeight+$iControlSpace
    Global $iWidthGuiSpecs=$iWidthGuiMain, $iHeightGuiSpecs=$iHeightGuiMain
    ; Array mit Text zum erstellen des Spec Fensters, ControlID des Datenlabels, Funktion zum konvertieren der Daten
    Global $arGameSpecLabels=[["Spielname: ", -1, -1],["Betriebssystem: ", -1, -1], ["Arbeitsspeicher: ", -1, "_byteToString"], ["Grafikkartenspeicher: ", -1, "_byteToString"]]
    ; Es könnte sinnvoll sein, die Daten in eine andere Datei (z.B. INI) auszulagern, wenn es zu viele werden
    ; Ansonsten: Größere Datenmengen mit dem gleichen Aufbau immer in Arrays speichern um diese automatisiert zu bearbeiten und mehrfach verwendeten, kopierten Code zu vermeiden.
    Global $arGameSpecs=[ _ ; Gamename, OS, RAM, VRAM, ...
                            ["Valorant", "Windows 7/8/10 (64-bit)",4*$iGB,1*$iGB], _
                            ["GTA V", "Windows 7/8/10 (64-bit)",6*$iGB,2*$iGB], _
                            ["The Forest", "Windows 7/8/10 (64-bit)",7*$iGB,4*$iGB], _
                            ["Apex Legends", "Windows 7/8/10 (64-bit)",8*$iGB,8*$iGB], _
                            ["League of Legends", "Windows 7/8/10 (64-bit)",12*$iGB,6*$iGB] _
                        ]
    
    ;Hier wird ein Fenster erstellt
    $iGui_Main=GUICreate("Gamestat info", $iWidthGuiMain, $iHeightGuiMain)
    
    ;Hier werden DropDownMenu, sowie Inhalt des Menus erstellt
    $iCombo_GameSelect = GUICtrlCreateCombo("", $iControlSpace, $iControlSpace, $iWidthGuiMain-$iControlSpace*2, $iControlHeight)
    GUICtrlSetData($iCombo_GameSelect, _ArrayToString($arGameSpecs, "", Default, Default, "|", 0, 0))
    
    ;Hier wird ein Button erstellt
    $iButton_Search = GUICtrlCreateButton("Suchen", $iControlSpace, $iControlSpace + $iControlCalcHeight, $iWidthGuiMain-$iControlSpace*2, $iControlHeight)
    ;Hier wird der Button ausgewählt.
    GUICtrlSetState(-1, $GUI_FOCUS)
    
    $iLabel_ShowSection=GUICtrlCreateLabel("Du befandest dich im Bereich: - ", $iControlSpace, $iControlSpace + $iControlCalcHeight*2,$iWidthGuiMain-$iControlSpace*2, $iControlHeight)
    
    ; Erstelle das Specs Fenster
    $iGui_Specs=GUICreate("Specs", $iWidthGuiSpecs, $iHeightGuiSpecs)
    ; Erstelle die Labels für die Informationen
    For $i=0 To UBound($arGameSpecLabels)-1 Step 1
        local $iLabelWidth=($iWidthGuiSpecs-$iControlSpace*3)/2
        ; Erstelle das Label mit dem Infotext links
        GUICtrlCreateLabel($arGameSpecLabels[$i][0], $iControlSpace, $iControlSpace + $iControlCalcHeight*$i, $iLabelWidth, $iControlHeight)
        ; Erstelle das Label mit den Infos rechts
        $arGameSpecLabels[$i][1]=GUICtrlCreateLabel("", $iControlSpace*2 + $iLabelWidth, $iControlSpace + $iControlCalcHeight*$i, $iLabelWidth, $iControlHeight)
    Next
    
    ;Zeigt das Main Fenster bzw. GUI an
    GUISetState(@SW_SHOW, $iGui_Main)
    
    
    ;Das ist eine Endlos-Schleife, damit das Programm weiterläuft, bis Exit aufgerufen wird.
    While true
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE ; Fenster wurde geschlossen
                Exit ; Beende das Programm
            Case $iButton_Search ; $iButton_Search wurde geklickt
                _showSpecs() ; Funktionsaufruf mit dem Default parameter => aktuell ausgewählter Index wird verwendet
        EndSwitch
    WEnd
    
    Func _showSpecs($iIndexOfGame=-1)
        ; Nehme den aktuell ausgewählten index, wenn kein anderer angegeben wurde
        If $iIndexOfGame=-1 Then
            ; Lese den aktuell ausgewählten index aus
            $iIndexOfGame=_GUICtrlComboBox_GetCurSel($iCombo_GameSelect)
        EndIf
        GUICtrlSetData($iLabel_ShowSection,"Du befandest dich im Bereich: " & $arGameSpecs[$iIndexOfGame][0])
        ; Setze den Text der Labels im Spec Fenster
        For $i=0 To UBound($arGameSpecLabels)-1 Step 1
            GUICtrlSetData($arGameSpecLabels[$i][1] ,$arGameSpecLabels[$i][2]=-1 ? $arGameSpecs[$iIndexOfGame][$i]: Call($arGameSpecLabels[$i][2], $arGameSpecs[$iIndexOfGame][$i]))
        Next
        GUISetState(@SW_HIDE, $iGui_Main)
        GUISetState(@SW_SHOW, $iGui_Specs)
        ; Endlosschleife um auf das Schließen des Specs Fensters zu warten
        While true
            $nMsg = GUIGetMsg()
            Switch $nMsg
                Case $GUI_EVENT_CLOSE ; Fenster wurde geschlossen
                    ExitLoop ; Verlasse die Endlosschleife
            EndSwitch
        WEnd
        GUISetState(@SW_HIDE, $iGui_Specs)
        GUISetState(@SW_SHOW, $iGui_Main)
    EndFunc
    
    Func _byteToString($iByteSize)
        Local $arByteShort = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
        local $iCount=0
        while $iByteSize>=1000 and $iCount<UBound($arByteShort)-1
            $iCount+=1
            $iByteSize/=1000
        WEnd
        return $iByteSize & " " &$arByteShort[$iCount]
    EndFunc
    Alles anzeigen

    MfG,

    Kanashius.

    Edit: Ich hab den Fehler behoben, der @Musashi aufgefallen ist, das hatte ich übersehen (war kein Versionsfehler) :)

    Zitat von Musashi

    Zumindest unter meiner AutoIt-Version (3.3.14.0) arbeitet Dein Skript aber nicht ganz korrekt.

    Es wird nach [Suchen] immer nur das erste Element (hier also "Valorant") angezeigt, egal was man in der ComboBox auswählt.

    Um das zu ändern, muss in der Func _showSpecs die Zeile :

    $iIndexOfGame=_GUICtrlComboBoxEx_GetCurSel($iCombo_GameSelect)

    ersetzt werden durch :

    $iIndexOfGame=_GUICtrlComboBox_GetCurSel($iCombo_GameSelect)

    (ggf. hat sich das Verhalten in der aktuellen Version von AutoIt aber geändert :/ ).

    Alles anzeigen

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™