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

Beiträge von gmmg

  • Darstellung flexibler Daten

    • gmmg
    • 23. Juli 2026 um 08:32

    das sagt die KI dazu.

    Für dein Vorhaben gibt es eine sehr elegante Lösung, die sowohl dein Datenbank-Problem löst als auch die optische Darstellung dynamisch und modern gestaltet.

    Der beste Ansatz für die Daten (EAV-Modell)

    Nutze weiterhin SQLite, aber verwende das Entity-Attribute-Value (EAV) Modell anstelle von Textdateien. Das ist der Standard für Produkte mit flexiblen Eigenschaften. Du benötigst nur zwei Tabellen:

    1. Artikel: ArtikelID, Artikelnummer, Name
    2. Eigenschaften: ArtikelID, EigenschaftsName, EigenschaftsWert
    • Vorteil: Keine leeren Felder, unendlich flexibel, rasend schnell durchsuchbar (besser als Textdateien) und extrem leicht in AutoIt abzufragen.

    Die optische Darstellung: Der "schönere" Weg (Dynamische GUI)

    Ein ListView ist funktional, wirkt aber oft altbacken. Da du maximal 30 Eigenschaften pro Artikel hast, ist eine dynamische GUI mit Labels und Inputs absolut performant und optisch überlegen.

    Du musst die Controls nicht manuell erstellen. Erzeuge sie stattdessen dynamisch per Schleife basierend auf den Eigenschaften des ausgewählten Artikels.

    Hier ist ein einfaches, funktionsfähiges AutoIt-Beispiel, wie du so eine dynamische Anzeige umsetzt:

    autoit

    C
    #include <GUIConstantsEx.紐>
    #include <WindowsConstants.au3>
    #include <ScrollBarsConstants.au3>
    
    ; Beispiel-Datenstruktur (wäre real dein SQLite-Abfrageergebnis)
    Dim $aProps[12][2] = [ _
        ["Farbe", "Blau"], ["Größe", "XL"], ["Gewicht", "450g"], _
        ["Material", "Baumwolle"], ["Hersteller", "ACME Corp"], ["Garantie", "2 Jahre"], _
        ["Anschluss", "USB-C"], ["Spannung", "5V"], ["Zustand", "Neu"], _
        ["Lagerort", "Regal 4"], ["EAN", "401234567890"], ["Preis", "19,99 €"] _
    ]
    
    $hGUI = GUICreate("Artikel-Eigenschaften", 400, 300)
    GUISetState(@SW_SHOW)
    
    ; Zeige die Eigenschaften an
    _ShowProperties($hGUI, $aProps)
    
    Do
        $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE
    
    Func _ShowProperties($hParent, $aData)
        Local $iTop = 20
        Local $iLeftLabel = 20
        Local $iLeftInput = 150
        Local $iRowHeight = 30
    
        ; Schleife durchläuft alle existierenden Eigenschaften des Artikels
        For $i = 0 To UBound($aData) - 1
            ; Erstelle Label für den Namen der Eigenschaft
            GUICtrlCreateLabel($aData[$i][0] & ":", $iLeftLabel, $iTop + ($i * $iRowHeight), 120, 20)
            
            ; Erstelle schreibgeschütztes Input-Feld für den Wert
            GUICtrlCreateInput($aData[$i][1], $iLeftInput, $iTop + ($i * $iRowHeight) - 4, 200, 20, 0x0800) ; 0x0800 = $ES_READONLY
        Next
    EndFunc
    Alles anzeigen

    Verwende Code mit Vorsicht.


    Profil-Tipps für die Umsetzung:

    • Das Scrollbar-Problem: Wenn ein Artikel 30 Eigenschaften hat, passt das nicht mehr in ein kleines Fenster. Erstelle in AutoIt ein Child-Fenster mit Scrollbars (_GUICtrlScrollbar_Create) innerhalb deiner Haupt-GUI. So bleibt deine Maske kompakt, aber der Nutzer kann sanft durch die 30 Inputs scrollen.
    • Alternative "Gegenstands-Ansicht" (PropertyGrid): Wenn du den ListView-Aufwand mit der Input-Optik kombinieren willst, schaue dir im AutoIt-Forum das UDF _GUICtrlPropertyGrid an. Das sieht aus wie die Eigenschafts-Leiste in Entwicklungsumgebungen (links Name, rechts Wert) und scrollt automatisch.

    Ich würde dir definitiv zum EAV-Datenbankmodell + dynamischen Labels/Inputs mit Scrollbar raten. Das fühlt sich für den Endnutzer an wie eine professionelle Software.


    Hier ist ein vollständiges, praxisnahes AutoIt-Beispiel, das zeigt, wie du das EAV-Modell (Entity-Attribute-Value) in SQLite aufbaust, Daten abfragst und für einen bestimmten Artikel ausgibst.

    In diesem Setup speichert die Datenbank nur die Eigenschaften, die ein Artikel wirklich besitzt. Es gibt keine leeren Spalten (NULL-Werte) und du bleibst maximal flexibel.

    AutoIt & SQLite: Das EAV-Beispiel

    Kopiere diesen Code direkt in Scite. Er erstellt eine Datenbank im Arbeitsspeicher (:memory:), befüllt sie mit Testdaten und zeigt dir, wie einfach die Abfrage ist.

    autoit

    C
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <Array.au3>
    
    ; 1. SQLite initialisieren
    _SQLite_Startup()
    If @error Then Exit MsgBox(16, "Fehler", "SQLite.dll konnte nicht geladen werden!")
    
    ; Datenbank im Arbeitsspeicher erstellen (für den Test)
    Local $hDB = _SQLite_Open() 
    
    ; 2. EAV-Tabellenstruktur erstellen
    ; Tabelle 1: Die Hauptartikel (Entities)
    _SQLite_Exec($hDB, "CREATE TABLE tbl_Artikel (ArtikelID INTEGER PRIMARY KEY AUTOINCREMENT, Artikelnummer TEXT UNIQUE, Name TEXT);")
    
    ; Tabelle 2: Die dynamischen Eigenschaften (Attributes & Values)
    ; FOREIGN KEY sorgt dafür, dass Eigenschaften gelöscht werden, wenn der Artikel gelöscht wird.
    _SQLite_Exec($hDB, "CREATE TABLE tbl_Eigenschaften (" & _
                       "EigenschaftID INTEGER PRIMARY KEY AUTOINCREMENT, " & _
                       "ArtikelID INTEGER, " & _
                       "EigenschaftsName TEXT, " & _
                       "EigenschaftsWert TEXT, " & _
                       "FOREIGN KEY(ArtikelID) REFERENCES tbl_Artikel(ArtikelID) ON DELETE CASCADE);")
    
    ; 3. Testdaten einfügen
    ; Artikel 1: Ein T-Shirt (hat Textil-Eigenschaften)
    _SQLite_Exec($hDB, "INSERT INTO tbl_Artikel (Artikelnummer, Name) VALUES ('ART-001', 'Laufshirt Pro');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (1, 'Farbe', 'Blau');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (1, 'Größe', 'XL');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (1, 'Material', 'Polyester');")
    
    ; Artikel 2: Ein USB-Ladegerät (völlig andere technische Eigenschaften)
    _SQLite_Exec($hDB, "INSERT INTO tbl_Artikel (Artikelnummer, Name) VALUES ('ART-002', 'USB-C Ladeadapter');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (2, 'Spannung', '20V');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (2, 'Leistung', '65W');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (2, 'Anschlüsse', '2x USB-C');")
    _SQLite_Exec($hDB, "INSERT INTO tbl_Eigenschaften (ArtikelID, EigenschaftsName, EigenschaftsWert) VALUES (2, 'Farbe', 'Schwarz');") ; Gleiche Eigenschaft wie oben, anderer Wert
    
    
    ; 4. PRAXIS-ANWENDUNG: Eigenschaften eines bestimmten Artikels laden
    Local $sSuchArtikelnummer = "ART-002" ; Hier deine gewünschte Artikelnummer eintragen
    
    Local $aResult, $iRows, $iColumns
    Local $sSQL = "SELECT e.EigenschaftsName, e.EigenschaftsWert " & _
                  "FROM tbl_Eigenschaften e " & _
                  "JOIN tbl_Artikel a ON e.ArtikelID = a.ArtikelID " & _
                  "WHERE a.Artikelnummer = " & _SQLite_FastEscape($sSuchArtikelnummer) & ";"
    
    If _SQLite_GetTable2d($hDB, $sSQL, $aResult, $iRows, $iColumns) = $SQLITE_OK Then
        ; $aResult enthält nun ein 2D-Array mit allen existierenden Eigenschaften
        ; Zeile 0 enthält die Spaltenüberschriften, ab Zeile 1 liegen die Daten
        _ArrayDisplay($aResult, "Eigenschaften für " & $sSuchArtikelnummer)
    Else
        MsgBox(16, "Fehler", "Fehler bei der Datenbankabfrage.")
    EndIf
    
    ; 5. Datenbank schließen
    _SQLite_Close($hDB)
    _SQLite_Shutdown()
    Alles anzeigen

    Verwende Code mit Vorsicht.


    Die Vorteile dieses SQL-Setups für dein Projekt:

    1. Dynamisches Array für deine GUI: Das Ergebnis-Array $aResult (wenn du Zeile 0 ignorierst) hat exakt das Format, das die dynamische GUI-Schleife aus der ersten Antwort benötigt ($aResult[$i][0] = Name, $aResult[$i][1] = Wert). Du übergibst das Array einfach an deine Anzeigefunktion.
    2. Gezielte Suche (Dein "Tags"-Gedanke): Wenn du alle Artikel suchst, die z.B. die Eigenschaft Farbe = Blau haben, schreibst du einfach:

      sql

      SQL
      SELECT ArtikelID FROM tbl_Eigenschaften WHERE EigenschaftsName = 'Farbe' AND EigenschaftsWert = 'Blau';

      Verwende Code mit Vorsicht.


    3. Keine Daten-Redundanz: Wenn du morgen ein neues Produkt mit 50 völlig neuen Eigenschaften (z.B. "Akkukapazität", "Profiltiefe") hinzufügst, musst du keine Tabellenstruktur in der DB ändern. Du fügst sie einfach als neue Zeilen in tbl_Eigenschaften ein.
  • Hallo Zusammen

    • gmmg
    • 2. Juli 2026 um 10:57

    Hallo Harald,

    das ist ein Spanndes Projekt. Danke für's teilen.

    Gruß gmmg

  • chrome-automation Project

    • gmmg
    • 1. Juli 2026 um 13:39

    BananaJoe falls du Fragen hast oder andere Beispiele brauchst, gern Posten.

    Hier mal ein Codeschnipsel, wie man eine Cookie Meldung klickt.

    AutoIt
    				$page.goto($url)
    
    				;accept cookie policy
    				;---------------------------------------------------------------
    				Sleep(1000)
    				$page.evaluate('document.querySelector("#usercentrics-root").shadowRoot.querySelector("#bottom-layer-focus-lock > div.sc-jlZhew.ejUmQC > div > div.sc-fhzFiK.dZsLRG > div > div > div.sc-koXPp.kpSpgG > div > button.sc-gsFSXq.jBXGLa").click();')
    				Sleep(600)
    				$page.locator("//*[@id='username']").sendKeys($user)
    				Sleep(100)
    				$page.locator("//*[@id='password']").sendKeys($pass)
    				Sleep(100)
    				$page.locator("//*[@id='app']/main/div/div/div/div[2]/div/div/div/form/div[3]/submit").click()
    Alles anzeigen

    Gruß gmmg

  • chrome-automation Project

    • gmmg
    • 30. Juni 2026 um 10:55

    Hallo Zusammen,

    ich wollte euch nochmal auf das Projekt "AutoIt CDP UDF" aufmerksam machen. Mit desem lassen sich ohne Webdriver (chromedriver/edgedriver) Webseiten automatisieren.

    [UDF] AutoIt CDP UDF — A Modern, Playwright‑Style Chrome Automation Library
    Hi everyone, After months of development, testing, and refinement, I’m excited to share something new with the AutoIt community: AutoIt CDP UDF A modern,…
    www.autoitscript.com

    Hier mal ein Beispiel

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #include "CDP.au3"
    
    ;VOR DEM START ALLE EVENTUELLEN COOKIE-DATEIEN IM PROFILRADIKAL LÖSCHEN ---
    Local $sProfile = @TempDir & "\chromeprofile"
    FileDelete($sProfile & "\Default\Cookies")
    FileDelete($sProfile & "\Default\Cookies-journal")
    FileDelete($sProfile & "\Default\Network\Cookies")
    FileDelete($sProfile & "\Default\Network\Cookies-journal")
    FileDelete($sProfile & "\Cookies")
    FileDelete($sProfile & "\Cookies-journal")
    
    ;$chrome = $browser.launch(Default, 9299, Default, Default)
    $chrome = $browser.launch(Default, 9299, Default, $sProfile)
    $page = $chrome.newPage()
    
    ; Window maximieren
    WinWait("[CLASS:Chrome_WidgetWin_1]")
    WinSetState("[CLASS:Chrome_WidgetWin_1]", "", @SW_MAXIMIZE)
    
    $page.goto("https://autoit.de/wcf/login/")
    
    $page.locator("//*[@id='username']").sendKeys("username")
    Sleep(1000)
    $page.locator("//*[@id='password']").sendKeys("password")
    Sleep(1000)
    $page.locator("//*[@id='submitButton']").click()
    
    ;$chrome.close()
    Alles anzeigen

    Eventuell kann es ja einer gebrauchen.

    Gruß gmmg

  • Website wird nicht gefunden

    • gmmg
    • 15. Juni 2026 um 14:06

    es wurde gefixt und im github bereitgestellt.

  • Website wird nicht gefunden

    • gmmg
    • 15. Juni 2026 um 12:49

    Beim Kompilieren zur Exe kommt leider eine Fehlermeldung. Habs mal im engl. Forum gepostet.

    [UDF] AutoIt CDP UDF — A Modern, Playwright‑Style Chrome Automation Library
    Hi everyone, After months of development, testing, and refinement, I’m excited to share something new with the AutoIt community: AutoIt CDP UDF A modern,…
    www.autoitscript.com
  • Website wird nicht gefunden

    • gmmg
    • 15. Juni 2026 um 09:40

    Hba es mal so gelöst, um die Cookies vorher zu löschen.

    AutoIt
    #include "CDP.au3"
    
    ; --- VOR DEM START ALLE EVENTUELLEN COOKIE-DATEIEN IM PROFILRADIKAL LÖSCHEN ---
    Local $sProfile = @ScriptDir & "\chromeprofile"
    FileDelete($sProfile & "\Default\Cookies")
    FileDelete($sProfile & "\Default\Cookies-journal")
    FileDelete($sProfile & "\Default\Network\Cookies")
    FileDelete($sProfile & "\Default\Network\Cookies-journal")
    FileDelete($sProfile & "\Cookies")
    FileDelete($sProfile & "\Cookies-journal")
    
    
    $chrome = $browser.launch(Default, 9299, Default, Default)
    Alles anzeigen
  • Website wird nicht gefunden

    • gmmg
    • 15. Juni 2026 um 08:55

    Habe eben bemerkt, dass AutoIt sich nicht schließt, wenn ich bereits eingeloggt bin. Wie könnte man da den cache vorher löschen?

    Gruß gmmg

  • Website wird nicht gefunden

    • gmmg
    • 15. Juni 2026 um 08:52

    Hallo Zusammen,

    basierend auf der "AutoIt CDP UDF", gleich mal ein Autologin Beispiel.

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #include "CDP.au3"
    
    ;$chrome = $browser.launch(Default, 9299, Default, Default, "1280,800")
    ;$chrome = $browser.launch(Default, 9299, "--start-maximized")
    $chrome = $browser.launch(Default, 9299, Default, Default)
    
    $page = $chrome.newPage()
    
    $page.goto("https://autoit.de/wcf/login/?url=https%3A%2F%2Fautoit.de%2Fwcf%2F/")
    
    $page.locator("//*[@id='username']").sendKeys("Username")
    Sleep(1000)
    $page.locator("//*[@id='password']").sendKeys("Password")
    Sleep(1000)
    $page.locator("//*[@id='submitButton']").click()
    Alles anzeigen


    Gruß gmmg

  • Lebenszeichen; Entwicklung; Sven (SOLVE-SMART) sagt AutoIt (Community) Goodbye!

    • gmmg
    • 12. Juni 2026 um 13:04

    sehr gut :)

  • Website wird nicht gefunden

    • gmmg
    • 11. Juni 2026 um 10:21

    habe dir mal ein Edgedriver Example mit allen Dateien erstellt. Im Ordner "edgedriver_win32" selbst liegt die edgedriver.exe
    , die musst du ggf. an deine Browserversion anpassen.

    Microsoft Edge-Webtreiber | Microsoft Edge-Entwickler


    Gruß gmmg

    Dateien

    Full_Edgedriver_Example.7z 6,48 MB – 130 Downloads
  • Lebenszeichen; Entwicklung; Sven (SOLVE-SMART) sagt AutoIt (Community) Goodbye!

    • gmmg
    • 10. Juni 2026 um 08:38

    Hallo Sven ( SOLVE-SMART),

    danke für deine Zeit hier in der Community.

    Lass es dir gut gehen und bleib so wie du bist :) Viel Erfolg weiterhin.

    Viele Grüße

    Marcel

  • AudioCaptureWrapper Tester

    • gmmg
    • 24. Mai 2026 um 23:50

    Danke, schaue ich mir mal an :)

    Hab es eben nochmal mit Teams getestet, da werden beide Seiten aufgezeichnet.

  • AudioCaptureWrapper Tester

    • gmmg
    • 22. Mai 2026 um 15:35

    Hallo UEZ,

    kann man über die DLL auch ein bestimmtest Programm ansprechen zum aufzeichnen. Wir haben die Idee, damit z.b. einen Call über ein Softphone aufzuzeichnen, was diese Funktion nicht inkludiert hat.

    Ich habe mir mal eine GUI mit KI Hilfe dazu gebaut.


    AutoIt
    #AutoIt3Wrapper_UseX64=y
    
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <StaticConstants.au3>
    #include <EditConstants.au3>
    
    #include <WinAPISys.au3>
    #include <WinAPIHObj.au3>
    
    
    ;~ Local $Sikom_pid = ProcessExists("SikomPhone.exe")
    
    ;~ If $Sikom_pid = 0 Then
    ;~     MsgBox(16, "Fehler", "SikomPhone.exe läuft nicht.")
    ;~ EndIf
    
    ; ===================================================================
    ; DLL
    ; ===================================================================
    
    Global $sDLL = @ScriptDir & "\AudioCaptureWrapper_x64.dll"
    
    If Not FileExists($sDLL) Then _AudioCaptureWrapper(True)
    
    Global $hDLL = DllOpen($sDLL)
    If $hDLL = -1 Then
        MsgBox(16, "Fehler", "DLL konnte nicht geladen werden!")
        Exit
    EndIf
    
    
    ; ===================================================================
    ; Speicherpfad
    ; ===================================================================
    
    ;Global $g_sOutputPath = @ScriptDir & "\Recordings"
    Global $g_sOutputPath = @DesktopDir & "\Recordings"
    
    If Not FileExists($g_sOutputPath) Then
        DirCreate($g_sOutputPath)
    EndIf
    
    ; ===================================================================
    ; Audio Einstellungen
    ; ===================================================================
    
    Const $adtsSampleRateIdx = 3 ; 48000 Hz
    Const $adtsChannels      = 2
    
    Global $sampleRate     = 48000
    Global $channels       = $adtsChannels
    Global $bitrate        = 128000
    
    Global $enableLoopback = 1
    Global $enableMic      = 1
    
    ; ===================================================================
    ; Status
    ; ===================================================================
    
    Global $recording     = False
    Global $hFile         = 0
    
    Global $framesWritten = 0
    Global $totalBytes    = 0
    
    Global $bufSize       = 8192
    
    ; ===================================================================
    ; Buffer
    ; ===================================================================
    
    Global $adts  = DllStructCreate("ubyte m[7]")
    Global $buf   = DllStructCreate("ubyte m[" & $bufSize & "]")
    Global $pts   = DllStructCreate("int64 pts")
    Global $flags = DllStructCreate("long flags")
    
    ; ===================================================================
    ; GUI
    ; ===================================================================
    
    Global $hGUI = GUICreate("AAC Audio Recorder", 520, 280)
    
    GUICtrlCreateLabel("ID Nummer:", 30, 25, 100, 20)
    
    Global $inputID = GUICtrlCreateInput("", 130, 20, 150, 28, $ES_NUMBER)
    
    Global $btnStart = GUICtrlCreateButton("Start Recording", 30, 80, 200, 50)
    Global $btnStop  = GUICtrlCreateButton("Stop Recording", 260, 80, 200, 50)
    
    Global $lblStatus = GUICtrlCreateLabel("Status: Bereit", 30, 170, 440, 25)
    
    GUICtrlSetFont($lblStatus, 10, 600)
    
    GUICtrlSetState($btnStop, $GUI_DISABLE)
    
    GUISetState(@SW_SHOW)
    
    ; ===================================================================
    ; Main Loop
    ; ===================================================================
    
    While 1
    
        Switch GUIGetMsg()
    
            Case $GUI_EVENT_CLOSE
    
                StopRecording()
                ExitLoop
    
            Case $btnStart
    
                StartRecording()
    
            Case $btnStop
    
                StopRecording()
    
        EndSwitch
    
        ; Aufnahme läuft
        If $recording Then
            CaptureAudioFrame()
        EndIf
    
        Sleep(1)
    
    WEnd
    
    DllClose($hDLL)
    
    ; ===================================================================
    ; Aufnahme starten
    ; ===================================================================
    
    Func StartRecording()
    
        If $recording Then Return
    
        ; ID prüfen
        Local $sID = GUICtrlRead($inputID)
    
        If StringStripWS($sID, 8) = "" Then
            MsgBox(48, "Hinweis", "Bitte eine ID Nummer eingeben.")
            Return
        EndIf
    
         ; Audio initialisieren
    
    	 ;Local $a = DllCall($hDLL, "none", "Audio_InitProcessCapture")
    	;MsgBox(0, "", @error)
    	
        Local $aResult = DllCall($hDLL, "long", "Audio_Init", _
                "long", $sampleRate, _
                "long", $channels, _
                "long", $bitrate, _
                "long", $enableLoopback, _
                "long", $enableMic)
    
    ;~ 		Local $aResult = DllCall($hDLL, "long", "Audio_InitProcessCapture", _
    ;~ 			"long", $Sikom_pid, _
    ;~ 			"long", $sampleRate, _
    ;~ 			"long", $channels, _
    ;~ 			"long", $bitrate)
    
        If @error Then
            MsgBox(16, "Fehler", "DllCall Error: " & @error)
            Return
        EndIf
    
        If $aResult[0] <> 0 Then
    
            Local $errBuf = DllStructCreate("char m[256]")
    
            DllCall($hDLL, "long", "Audio_GetLastError", _
                    "struct*", $errBuf, _
                    "long", 256)
    
            MsgBox(16, "Audio_Init Fehler", _
                    DllStructGetData($errBuf, "m"))
    
            Return
    
        EndIf
    
        ; ===================================================================
        ; Prüfen ob Sound läuft
        ; ===================================================================
    
        GUICtrlSetData($lblStatus, "Prüfe Audioaktivität...")
    
        If Not WaitForAudio(3000) Then
    
            MsgBox(48, "Kein Audio erkannt", _
                    "Es läuft aktuell kein Sound oder Call.")
    
            DllCall($hDLL, "none", "Audio_Stop")
            DllCall($hDLL, "none", "Audio_Cleanup")
    
            GUICtrlSetData($lblStatus, "Status: Kein Audio erkannt")
    
            Return
    
        EndIf
    
        ; ===================================================================
        ; Dateiname
        ; ===================================================================
    
        Local $sFile = $g_sOutputPath & "\record_ID-" & $sID & "_" & _
                @YEAR & "-" & _
                StringFormat("%02d", @MON) & "-" & _
                StringFormat("%02d", @MDAY) & "_" & _
                StringFormat("%02d", @HOUR) & "-" & _
                StringFormat("%02d", @MIN) & "-" & _
                StringFormat("%02d", @SEC) & ".aac"
    
        ; Datei erstellen
        $hFile = _WinAPI_CreateFile($sFile, 1)
    
        If $hFile = 0 Then
    
            MsgBox(16, "Fehler", _
                    "Output-Datei konnte nicht erstellt werden!")
    
            DllCall($hDLL, "none", "Audio_Stop")
            DllCall($hDLL, "none", "Audio_Cleanup")
    
            Return
    
        EndIf
    
        ; Reset
        $framesWritten = 0
        $totalBytes    = 0
    
        $recording = True
    
        ; GUI
        GUICtrlSetData($lblStatus, _
                "Status: Aufnahme läuft | ID: " & $sID)
    
        GUICtrlSetState($btnStart, $GUI_DISABLE)
        GUICtrlSetState($btnStop, $GUI_ENABLE)
        GUICtrlSetState($inputID, $GUI_DISABLE)
    
    EndFunc
    
    ; ===================================================================
    ; Wartet auf Audio
    ; ===================================================================
    
    Func WaitForAudio($timeoutMs = 3000)
    
        Local $start = TimerInit()
    
        Local $testBuf   = DllStructCreate("ubyte m[8192]")
        Local $testPts   = DllStructCreate("int64 pts")
        Local $testFlags = DllStructCreate("long flags")
    
        While TimerDiff($start) < $timeoutMs
    
            Local $aFrame = DllCall($hDLL, "long", "Audio_GetAacFrame", _
                    "struct*", $testBuf, _
                    "long", 8192, _
                    "struct*", $testPts, _
                    "struct*", $testFlags)
    
            If Not @error Then
    
                ; mehrere Frames prüfen
                If $aFrame[0] > 50 Then
                    Return True
                EndIf
    
            EndIf
    
            Sleep(50)
    
        WEnd
    
        Return False
    
    EndFunc
    
    ; ===================================================================
    ; Audio aufnehmen
    ; ===================================================================
    
    Func CaptureAudioFrame()
    
        Local $aFrame = DllCall($hDLL, "long", "Audio_GetAacFrame", _
                "struct*", $buf, _
                "long", $bufSize, _
                "struct*", $pts, _
                "struct*", $flags)
    
        Local $n = $aFrame[0]
    
        If $n > 0 Then
    
            ; ADTS Header
            WriteAdtsHeader($adts, _
                    $n, _
                    $adtsSampleRateIdx, _
                    $adtsChannels)
    
            Local $nBytes
    
            ; Header schreiben
            _WinAPI_WriteFile( _
                    $hFile, _
                    DllStructGetPtr($adts), _
                    7, _
                    $nBytes)
    
            ; AAC schreiben
            _WinAPI_WriteFile( _
                    $hFile, _
                    DllStructGetPtr($buf), _
                    $n, _
                    $nBytes)
    
            $framesWritten += 1
            $totalBytes += ($n + 7)
    
            ; Status
            GUICtrlSetData( _
                    $lblStatus, _
                    "Aufnahme läuft | Frames: " & _
                    $framesWritten & _
                    " | Bytes: " & _
                    $totalBytes)
    
        Else
    
            Sleep(5)
    
        EndIf
    
    EndFunc
    
    ; ===================================================================
    ; Aufnahme stoppen
    ; ===================================================================
    
    Func StopRecording()
    
        If Not $recording Then Return
    
        $recording = False
    
        ; Datei schließen
        If $hFile <> 0 Then
            _WinAPI_CloseHandle($hFile)
            $hFile = 0
        EndIf
    
        ; Audio stoppen
        DllCall($hDLL, "none", "Audio_Stop")
        DllCall($hDLL, "none", "Audio_Cleanup")
    
        ; GUI
        GUICtrlSetData($lblStatus, "Status: Aufnahme beendet")
    
        GUICtrlSetState($btnStart, $GUI_ENABLE)
        GUICtrlSetState($btnStop, $GUI_DISABLE)
        GUICtrlSetState($inputID, $GUI_ENABLE)
    
        MsgBox(64, "Aufnahme beendet", _
                "Frames: " & $framesWritten & @CRLF & _
                "Bytes: " & $totalBytes)
    
    EndFunc
    
    ; ===================================================================
    ; ADTS Header
    ; ===================================================================
    
    Func WriteAdtsHeader($hdr, $frameLen, $sampleRateIdx, $channels)
    
        Local $totalLen = $frameLen + 7
    
        $hdr.m((1)) = 0xFF
        $hdr.m((2)) = 0xF1
    
        $hdr.m((3)) = BitOR( _
                64, _
                BitShift($sampleRateIdx, -2), _
                BitShift($channels, 2))
    
        $hdr.m((4)) = BitOR( _
                BitShift(BitAND($channels, 3), -6), _
                BitAND(BitShift($totalLen, 11), 3))
    
        $hdr.m((5)) = BitAND( _
                BitShift($totalLen, 3), _
                0xFF)
    
        $hdr.m((6)) = BitOR( _
                BitShift(BitAND($totalLen, 7), -5), _
                0x1F)
    
        $hdr.m((7)) = 0xFC
    
    EndFunc
    
    ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2020-06-05
    ---- Hier noch die Funktionen einfügen---
    Alles anzeigen


    dem Script fehlen wegen Zeilenlänge noch die Funktionen aus deiner Datei.

    Gruß gmmg

  • Chromdriver.exe Downloader

    • gmmg
    • 19. Mai 2026 um 12:42

    Hallo Zusammen,

    folgend ein Downloader Skript für die aktuelle Stable "Chromdriver.exe" als Win32 Version. Eventuell braucht es einer.

    AutoIt
    ; 1. JSON laden
    Local $sUrl = "https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json"
    Local $bData = InetRead($sUrl, 1)
    Local $sJson = BinaryToString($bData, 4)
    
    ; 2. Versionsnummer extrahieren (aus dem Stable-Bereich)
    Local $sVerPattern = '(?i)"channels":.*?"Stable".*?"version":"(.*?)"'
    Local $aVerResult = StringRegExp($sJson, $sVerPattern, 3)
    Local $sVersion = "Unbekannt"
    
    If Not @error Then $sVersion = $aVerResult[0]
    
    ; 3. Download-Link extrahieren
    Local $sUrlPattern = '(?i)"Stable".*?"chromedriver".*?"platform":"win32".*?"url":"(.*?)"'
    Local $aUrlResult = StringRegExp($sJson, $sUrlPattern, 3)
    
    If Not @error Then
        Local $sDownloadUrl = $aUrlResult[0]
        Local $sSavePath = @ScriptDir & "\chromedriver_win32_" & $sVersion & ".zip"
    
        ; Download
        InetGet($sDownloadUrl, $sSavePath, 1)
    
        MsgBox($MB_ICONINFORMATION, "Erfolg", _
            "Version: " & $sVersion & @CRLF & _
            "Datei: " & $sSavePath)
    Else
        MsgBox(16, "Fehler", "Daten konnten nicht gelesen werden.")
    EndIf
    Alles anzeigen


    Gruß gmmg

  • Website wird nicht gefunden

    • gmmg
    • 11. Mai 2026 um 21:50

    hipfzwirgel ja, wenn du alle benötigten Webdriver Dateinen so ablegst geht das. Wenn die Exe kompiliert ist, brauchst du nur noch deine Exe Datei und die Webdriver exe (gekko.exe/ chromdriver.exe oder die Edgedriver.exe)

  • Website wird nicht gefunden

    • gmmg
    • 8. Mai 2026 um 14:32

    du benötigst dazu den aktuellen Geckodriver (https://github.com/mozilla/geckodriver/releases)

    und einige au3 Dateien für das Webdriver Projekt.

    Releases · Danp2/au3WebDriver
    Web Driver UDF for AutoIt. Contribute to Danp2/au3WebDriver development by creating an account on GitHub.
    github.com


    und unter https://github.com/Danp2/au3WebDriver die preconditions:

    • Json UDF - Archive includes Json.au3 & BinaryCall.au3.
    • WinHTTP UDF - Archive includes WinHttp.au3 & WinHttpConstants.au3. bzw. version 1.6.4.2 https://github.com/dragana-r/auto…ter/WinHttp.au3

    schau dir auch das utoit-webdriver-boilerplate Projekt von Sven dazu an:

    GitHub - sven-seyfert/autoit-webdriver-boilerplate: The project "autoit-webdriver-boilerplate" can be used as quick entry point for the awesome "au3WebDriver" project by @Danp2 (and @mlipok). The intention is, give people a easy start with WebDriver for…
    The project &quot;autoit-webdriver-boilerplate&quot; can be used as quick entry point for the awesome &quot;au3WebDriver&quot; project by @Danp2 (and @mlipok).…
    github.com
  • Website wird nicht gefunden

    • gmmg
    • 8. Mai 2026 um 13:57

    welche Browser kannst du denn nutzen?

    nur Firefox oder auch den Edge?

    Beispiel für Firefox:

    AutoIt
    #include "wd_core.au3"
    #include "wd_helper.au3"
    
    Local $sDesiredCapabilities, $sSession
    _WD_Option('Driver', 'geckodriver.exe') ; Pfad zum Geckodriver
    _WD_Option('Port', 4444)
    
    ; Firefox Profil/Einstellungen definieren
    $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"browserName": "firefox"}}}'
    
    ; Browser starten
    _WD_Startup()
    $sSession = _WD_CreateSession($sDesiredCapabilities)
    
    ; autoit.de aufrufen
    _WD_Navigate($sSession, "https://autoit.de/wcf/login/?url=https%3A%2F%2Fautoit.de%2F")
    
    ; Login-Felder ausfüllen (Beispiel-IDs/Namen, ggf. via F12 im Browser prüfen)
    Local $sUserField = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//input[@id='username']")
    _WD_ElementAction($sSession, $sUserField, 'value', "DeinBenutzername")
    
    Local $sPassField = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//input[@id='password']")
    _WD_ElementAction($sSession, $sPassField, 'value', "DeinPasswort")
    
    ; Login-Button klicken
    Local $sLoginBtn = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//*[@id='tpl_wcf_login']")
    _WD_ElementAction($sSession, $sLoginBtn, 'click')
    
    ; Session beenden (optional)
    ; _WD_DeleteSession($sSession)
    _WD_Shutdown()
    Alles anzeigen
  • Website wird nicht gefunden

    • gmmg
    • 7. Mai 2026 um 13:25

    hipfzwirgel warum nutzt du dazu nicht die Webdriver Automatisierung.

    Die gibt es für Edge/Google Chrome/ Firefox und ggf. andere und im Forum sollte es auch diverse Beispiele geben.

    Hier mal ein Beispiel per Webdriver für den GoogleChrome Browser und was man dafür alles braucht.

    Beitrag

    RE: Google Chrome Automatisierung WebDriver UDF

    Das ist ohne dein Script zu kennen schwierig zu beantworten, da es verschiedene Ansätze gibt.

    Schau dir einmal das "Getting started example" Script im Abschnitt "create capabilites for session" auf der folgenden Webseite an, da sollte das klar werden.

    https://www.autoitscript.com/wiki/WebDriver

    Ansonsten poste doch mal dein Script (ohne URL und Passwörter)

    Hier mal ein Beispiel zum Login für Autoit, so wie ich das mache. Achtung hier wird noch die Chrome Version anhand der GoogleChrome.exe…
    gmmg
    5. September 2024 um 13:03

    Gruß gmmg

  • AudioCaptureWrapper Tester

    • gmmg
    • 7. Mai 2026 um 08:55

    Hallo UEZ,

    das funktioniert. Mein Fehler war, dass ich die Musik in einer Teamviewer Sitzung geöffnet hatte :)

    Wenn mal mal schnell was testen will 8o

    Audio_Init OK. Aufnahme startet fuer 5000 ms in 0.5 Sekunden...
    AAC-Frames geschrieben: 252
    Gesamtbytes : 88114
    ASC (2 Bytes): [11 90]
    Fettisch: test_output.aac mit einem AAC faehigen Player oeffnen!

    Gruß gmmg

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™