HotKey dynamisch aus Datenbankabfrage erstellen

  • Hallo zusammen,

    ich möchte mehrere Hotkeys erstellen, die dynamisch aus Werten einer Datenbankabfrage zusammengestellt werden. Wieviele es am Ende sid, ist ganz unterschiedlich und vorher nicht bekannt.

    Hier ist mein bisheriger Versuch:

    Spoiler anzeigen
    [autoit]


    _SQLite_Query($hDB, "SELECT subject,text,key From texte WHERE active='1'", $aQuery)
    ; Auslesen der nächsten Zeile
    _SQLite_FetchData($aQuery, $aRow, False, True)
    For $fi = 0 To UBound($aRow)-1
    $aRow[2] = StringReplace($aRow[2], "+", "")
    $aRow[2] = StringReplace($aRow[2], "STRG", "^")
    $aRow[2] = StringReplace($aRow[2], "Shift", "+")
    $aRow[2] = StringReplace($aRow[2], "ALT", "!")
    $sethkey &= HotKeySet($aRow[2], "ssf")
    $fi+1
    Next
    _SQLite_Close()
    _SQLite_Shutdown()

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

    Func ssf()
    MsgBox(0, "Test", "Funktionsaufruf durch HotKey hat wohl geklappt.")
    EndFunc ;==>ssf

    [/autoit]

    Der Wert "key" aus der Datenbank enthält z. B. "STRG+Shift+F2". Dieser wird dann durch StringReplace in die richtige Form gebracht, was auch einwandfrei funktioniert.

    Nur kriege ich es nicht hin, dann die HotKeySet Funktionen entsprechend gesetzt werden, sodass diese am Ende funktioneren.

  • Du hast gleich mehrere Fehler in deinem Skript, so wie ich das sehe.

    Zuerst ist zu bemängeln, dass wir ohne eine Datenbank mit diesem Schnipsel nichts anfangen können, ergo auch nicht (ohne Mehraufwand) testen und probieren können. In Zukunft würde ich dich bitten, immer ein lauffähiges Testskript mit deinem Problem anzuführen. Die Formatierung bzw. Einrückung ist außerdem grässlich, SciTE4AutoIt liefert extra das Tool Tidy mit, aufrufbar mit Strg+T.

    Ich vermute, dass der Schnipsel eigentlich in eine Schleife eingegliedert ist, sodass das FetchData einen Sinn bekommt. So hat es das leider nicht. Das Erhöhen des Variablenwertes in Zeile 10 ist ebenso unnötig (Nebenbei auch falsch, es müssste $fi += 1 heißen!), das geschieht durch die For-To-Schleife von selber.

    Falls du FetchData nicht in einer Schleife anwendest: Diese Funktion ist dazu da, eine einzelne Zeile aus einem Query abzurufen, praktisch eine "Hole-Die-Nächste-Zeile"-Funktion. Das heißt, sie muss in einer Schleife ausgeführt werden. Du solltest dir eventuell mal den Hilfe-Eintrag zu dieser Funktion anschauen.

    Das Verarbeiten des HotKey-Strings selber ist auch nicht ganz korrekt. Mal angenommen, in der Datenbank stände "ALT+D": Wenn du diese Kombination konvertierst, hast du "!D", was aber zum Auslösen die Kombination Alt+Shift+d benötigt. Hört sich unverständlich an, hat aber eine einfache Begründung. Bei "!D" liegt der Hotkey auf dem großen D, daher ist noch der Druck von Shift nötig. Wenn du "!d" nimmst, genügt Alt+d. Du solltest also vorher per StringLower den kompletten String in Kleinbuchstaben umwandeln.

    Zum Schluss fällt mir noch auf, dass in dem Skript keine Hauptschleife existiert. Wenn man den Code so ausführen würde, dann würde der Interpreter fast sofort ans Ende gelangen und sich beenden. Du brauchst noch so eine Konstruktion:

    [autoit]


    While True
    Sleep(20)
    WEnd

    [/autoit]
  • Nachfolgend mal das gesamte Script und die Datenbank im Anhang:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Clipboard.au3>
    #include <Date.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPIShellEx.au3>
    #include <GuiMenu.au3>
    #include <WinAPI.au3>
    #include <TrayConstants.au3>
    ;#include "C:\Users\streif.stefan\Desktop\install\test2\settings.au3"
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <StaticConstants.au3>
    #include<Array.au3>

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

    ;FileInstall("hilfe.gif", @TempDir & "\")
    ;FileInstall("Win Makros.rtf", @TempDir & "\")
    ;FileInstall("sqlite3.dll", @TempDir & "\")
    Opt("GUIOnEventMode", 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)

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

    Global $g_idExit, $aQuery, $aRow, $listview, $aResult, $iRows, $iColumns, $iRval, $sItem, $ttest, $setfunc, $sethkey, $manueltext
    Global Enum $e_ftasten = 1000, $e_idOpen, $e_idSave, $e_idExit, $e_options, $e_idCopy, $e_idPaste, $e_idAbout, $fprint
    Global $g_date = @MDAY & "." & @MON & "." & @YEAR
    Global $g_time = @HOUR & ":" & @MIN

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

    _Main()

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

    Func _Main()

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

    Global $hGUI = GUICreate("Smile Autokommentar Tool V.2", 600, 600, -1, $WS_EX_ACCEPTFILES)
    ;GUISetBkColor(0x000000)

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

    ;GUICtrlSetDefBkColor(0x666666)
    ;GUICtrlSetDefColor(0xFFB400)

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

    GUICtrlCreateLabel("Bitte ein Button anklicken oder die entsprechende F-Tasten Kombination drücken" & @CRLF & "(STRG + Shift + die auf den Button angezeigten F-Tasten)", 10, 10)
    $listview = GUICtrlCreateListView("Subject |Text|Hotkey", 10, 50, 500, 400)
    ;GUICtrlSetColor(-1, 0xFFB400)
    ;GUICtrlSetBkColor(-1, 0x000000)

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

    ; Create File menu
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "F-Tasten drucken", $e_ftasten)
    _GUICtrlMenu_InsertMenuItem($hFile, 1, "", 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 2, "Beenden", $e_idExit)

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

    ; Create Options menu
    $hOptions = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hOptions, 0, "Optionen", $e_options)

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

    ; Create Help menu
    $hHelp = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hHelp, 0, "&About", $e_idAbout)

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

    ; Create Main menu
    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "&File", 0, $hFile)
    _GUICtrlMenu_InsertMenuItem($hMain, 1, "&Einstellungen", 0, $hOptions)
    _GUICtrlMenu_InsertMenuItem($hMain, 2, "&Help", 0, $hHelp)

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

    ; Set window menu
    _GUICtrlMenu_SetMenu($hGUI, $hMain)

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

    Global $hilfepic = GUICtrlCreatePic(@TempDir & "\hilfe.gif", 570, 5, 20, 20)
    GUICtrlSetOnEvent($hilfepic, "_Hilfe")
    GUICtrlSetCursor($hilfepic, 4)
    GUICtrlCreateLabel("© 2014 - Tool erstellt von: Stefan Streif", 10, 325, 300, 15)
    GUICtrlSetColor(-1, 0xFFB400)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "OnExit")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize')
    TraySetOnEvent(-7, '_Restore')
    GUISetState() ; display the GUI
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    _SETTINGS()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    While 1
    Sleep(1000)
    WEnd
    EndFunc ;==>_Main
    Func _SETTINGS()
    _SQLite_Startup()
    If @error Then Exit MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
    If FileExists("settings.sqlite") Then
    $hDB = _SQLite_Open("settings.sqlite")
    If @error Then Exit MsgBox(16, "SQLite Fehler", "1 - Kann die Datenbank nicht öffnen!")
    ; DB Abfrage der gesamten Tabelle "settings"
    _SQLite_Query($hDB, "SELECT * FROM settings", $aQuery)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($aQuery, $aRow, False, True) = $SQLITE_OK
    Global $uLine1 = $aRow[1]
    Global $uLine2 = $aRow[2]
    Global $uLine3 = $aRow[3]
    Global $sPaste = $aRow[4]
    WEnd
    If _SQLite_GetTable2d($hDB, "Select subject,text,key From texte WHERE active='1'", $aResult, $iRows, $iColumns) = $SQLITE_OK Then
    For $iR = 1 To $iRows
    $sItem = ""
    For $iC = 0 To $iColumns - 1
    $sItem &= $aResult[$iR][$iC] & "|"
    Next
    GUICtrlCreateListViewItem(StringTrimRight($sItem, 1), $listview)
    Next
    Else
    MsgBox($MB_SYSTEMMODAL, "SQLite Error: " & _SQLite_ErrMsg())
    EndIf
    $uLine2 = StringReplace($uLine2, "%datum%", $g_date)
    $uLine2 = StringReplace($uLine2, "%zeit%", $g_time)
    $uLine2 = StringReplace($uLine2, "%name%", @UserName)
    $First3Lines = $uLine1 & @CRLF & $uLine2 & @CRLF & $uLine3 & @CRLF
    _SQLite_Query($hDB, "SELECT subject,text,key From texte WHERE active='1'", $aQuery)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($aQuery, $aRow, False, True) = $SQLITE_OK
    $aRow[2] = StringReplace($aRow[2], "+", "")
    $aRow[2] = StringReplace($aRow[2], "STRG", "^")
    $aRow[2] = StringReplace($aRow[2], "Shift", "+")
    $aRow[2] = StringReplace($aRow[2], "ALT", "!")
    Local $hkeyfunc = "ssf("&$manueltext=$aRow[1]&")"
    HotKeySet($aRow[2], $hkeyfunc)
    WEnd
    _SQLite_Close()
    _SQLite_Shutdown()
    Else
    MsgBox(16, "SQLite Fehler", "Die Datenbank wurde nicht gefunden!" & @CRLF & "Es werden nun die 'Einstellungen' geöffnet," & @CRLF & "um eine neue Datenbank zu erstellen!")
    _OPTIONS()
    EndIf
    EndFunc ;==>_SETTINGS
    ; Handle menu commands
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch _WinAPI_LoWord($wParam)
    Case $e_ftasten
    fprint()
    Case $e_idExit
    Exit
    Case $e_options
    _OPTIONS()
    Case $e_idAbout
    MsgBox(BitOR($MB_OK, $MB_ICONINFORMATION, $MB_DEFBUTTON1, $MB_SYSTEMMODAL, $MB_SETFOREGROUND), 'About', 'Dieses Tool wurde geschrieben von:' & @CRLF & @CRLF & 'Stefan Streif' & @CRLF & 'Technical Support' & @CRLF & 'NL Villingen-Schwenningen' & @CRLF & 'Tel: 07721 6806 29470')
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    ; --------------- Functions ---------------
    Func ssf($manueltext)
    ;_ClipBoard_SetData($uLine1 & @CRLF & $uLine2 & @CRLF & $uLine3 & @CRLF & $manueltext)
    ;If $sPaste = "1" Then Send("^v")
    MsgBox(0, "Test", "Funktionsaufruf hat wohl geklappt.")
    EndFunc ;==>ssf

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

    Func fprint()
    Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(4145, "F-Tastenbelegung drucken", "Wenn du auf 'OK' klickst, wird der Druckauftrag sofort gestartet und auf dem in Windows definierten Standard Drucker gedruckt.")
    Select
    Case $iMsgBoxAnswer = 1 ;OK
    $printfile = @TempDir & "\Win Makros.rtf"
    _WinAPI_ShellExecute($printfile, '', '', 'print')
    If @error Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Unable to open "' & $printfile & '".' & @CRLF & @CRLF & @extended)
    EndIf
    Case $iMsgBoxAnswer = 2 ;Cancel
    EndSelect
    EndFunc ;==>fprint
    Func _Hilfe()
    MsgBox(BitOR($MB_ICONQUESTION, $MB_SYSTEMMODAL), 'Information', 'Eine generelle Hilfe gibt es aktuell nicht' & @CRLF & @CRLF & 'Falls bei einer Funktion eine Erklärung notwendig ist,' & @CRLF & @CRLF & 'dann wird bei dieser Funktion ein entsprechendes Hilfezeichen sein.' & @CRLF & @CRLF & 'Solltest Du weitergehende Hilfe brauchen, dann klicke im Menü oben auf "Hilfe" -> "About" und kontaktiere den dort angegebenen Autor dieses Tools.')
    EndFunc ;==>_Hilfe
    Func _NeustartNachDBErstellung()
    MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), 'Information', 'Die Datenbank wurde erstellt. Das Tool wird nach drücken des "OK" Buttons neu gestartet, damit die eben erstellte Datenbank eingelesen und die Einstellungen übernommen werden können.')
    Exit Run(@ScriptFullPath)
    EndFunc ;==>_NeustartNachDBErstellung
    Func OnExit()
    Exit
    EndFunc ;==>OnExit
    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc ;==>_Minimize
    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc ;==>_Restore

    [/autoit]

    Ich habe es nun hinbekommen, dass die HiotKEySet Funktionen gesetzt werden. Nun stehe ich aber vor einem neuen Problem:

    ich möchte beim Funktionsaufruf der hotkeys, dass in der Funktion Variablen mitgegeben werden, die aus euinem Text bestehen, also so:

    [autoit]


    Local $hkeyfunc = "ssf("&$aRow[1]&")"
    HotKeySet($aRow[2], $hkeyfunc)

    [/autoit]

    Wenn ich die Funktion "ssf" ohne Variable aufrufe, funktioniert es einwandfrei. Sobald ich es aber so umsetze, dass es mit Variable aufgerufen wird, funktioniert der Funktionsaufruf nicht mehr.

    Was mache ich dabei falsch?

  • Bei einem HotKeySet-Callback kann man keine Parameter angeben, die Funktion wird immer ohne Parameter aufgerufen. Du musst da einen kleinen Umweg gehen.
    Spontan fiele mir ein, beim Durchlaufen in der Schleife von dem HotKeySet ein assoziatives Array mit Schlüssel/Wert Tastenkombination/Text zu benutzen.

    Ein assoziatives Array ist ein Array, welches keinen numerischen Index nutzt, sondern anders (meist per String) indiziert wird. Anstatt $array[0] = "bar" kannst du also $dict("foo") = "bar" schreiben. Für "foo" setzt du dann einfach den HotKey ein, für "bar" den Text.
    In der HotKey-Funktion kannst du dann mit dem Makro @HotKeyPressed auf den gedrückten HotKey als String zugreifen, welchen du dann einfach als Index einsetzt. Ein kleines Beispiel zur Nutzung von assoziativen Arrays anhand des COM-Objekts Scripting.Dictionary:

    [autoit]


    $oDict = ObjCreate("Scripting.Dictionary") ;COM-Objekt erstellen (EINMALIG)
    $oDict("foo") = "bar" ;Dem Schlüssel "foo" den Wert "bar" zuweisen
    MsgBox(64, "Info", $oDict("foo")) ;Über den Schlüssel "foo" den Wert "bar" auslesen
    $oDict = Null ;COM-Objekt wieder freigeben (EINMALIG)

    [/autoit]
  • Wie ich mit assoziativen Arrays umgehe, weiß ich einigermaßen. Ich habe aber im Moment überhaupt kein plan, wie ich Deinen Vorschlag umsetzen soll. Entweder hab ich einfach noch viel zu wenig Ahnung oder ich stehe verdammt fest aufem Schlauch :)

    Könntest Du mir ein Beispiel geben?

  • Na klar. Ich nutze hier einfach mal zwei Arrays statt einer SQLite-Datenbank, ansonsten gibt es nicht so viele Unterschiede:

    Spoiler anzeigen
    [autoit]


    ;Beispieldatensätze
    Global $aRow[] = ["STRG+SHIFT+A", "ALT+D"]
    Global $aText[] = ["Irgendein Text", "Noch ein Text"]
    ;Dictionary erstellen
    Global $oDict = ObjCreate("Scripting.Dictionary")

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

    For $i = 0 To UBound($aRow) - 1
    $aRow[$i] = StringLower($aRow[$i])
    $aRow[$i] = StringReplace($aRow[$i], "+", "")
    $aRow[$i] = StringReplace($aRow[$i], "strg", "^")
    $aRow[$i] = StringReplace($aRow[$i], "shift", "+")
    $aRow[$i] = StringReplace($aRow[$i], "alt", "!")

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

    ;Die gedrückten Tasten sind die einzige Information, die wir in HotKeyHandler() zur Identifikation nutzen können.
    ;Wir speichern daher die Texte über die Tastenkombination als Schlüssel in einem Dictionary.
    $oDict($aRow[$i]) = $aText[$i]

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

    HotKeySet($aRow[$i], HotKeyHandler)
    Next

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

    While True
    Sleep(20)
    WEnd

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

    Func HotKeyHandler()
    ;Das Makro @HotKeyPressed enthält unsere Tastenkombination, über welche wir nun auf $oDict zugreifen:
    MsgBox(64, "Info", "Tastenkombination: " & @HotKeyPressed & @CRLF & "Text: " & $oDict(@HotKeyPressed))
    EndFunc ;==>HotKeyHandler

    [/autoit]

    Ich hoffe, so ist mein Vorschlag einigermaßen verständlich. ^^

  • Grundsätzlich habe ich Dein Vorschlag verstanden. Nur leider stehe ich jetzt vor dem Problem, dass ich die Arrays nicht korrekt befüllt bekomme, um mit denen dann arbeiten zu können. Ich habe nun den Code Bereich folgendermaßen geändert:

    Spoiler anzeigen
    [autoit]


    If _SQLite_GetTable2d($hDB, "Select text From texte WHERE active='1'", $aResult, $iRows, $iColumns) = $SQLITE_OK Then
    For $iR = 1 To $iRows
    For $iC = 0 To $iColumns - 1
    $otext &= $aResult[$iR][$iC]
    Next
    Next
    Else
    MsgBox($MB_SYSTEMMODAL, "SQLite Error: " & _SQLite_ErrMsg())
    EndIf
    If _SQLite_GetTable2d($hDB, "Select key From texte WHERE active='1'", $aResult, $iRows, $iColumns) = $SQLITE_OK Then
    For $iR = 1 To $iRows
    For $iC = 0 To $iColumns - 1
    $okey &= $aResult[$iR][$iC]
    Next
    Next
    Else
    MsgBox($MB_SYSTEMMODAL, "SQLite Error: " & _SQLite_ErrMsg())
    EndIf
    For $i = 0 To UBound($okey)
    ;Exit MsgBox(0, "Test", $otext & @CRLF & $okey)
    ;Dictionary erstellen
    Global $oDict = ObjCreate("Scripting.Dictionary")
    $okey[$i] = StringLower($okey[$i])
    $okey[$i] = StringReplace($okey[$i], "+", "")
    $okey[$i] = StringReplace($okey[$i], "strg", "^")
    $okey[$i] = StringReplace($okey[$i], "shift", "+")
    $okey[$i] = StringReplace($okey[$i], "alt", "!")
    $oDict($okey[$i]) = $otext[$i]
    HotKeySet($okey[$i], HotKeyHandler)
    ;Exit MsgBox(0, "Test", $otext[$i] & @CRLF & $okey[$i])
    Next

    [/autoit]

    Allerdings werden die Daten aus der Datenbankabfrage aneinandergereiht in die Arrays geschrieben und bilden damit im Prinzip nur ein einziges Element im Array.

    Ich bekomme es einfach nicht, bei der Datenbankabfrage die Arrays korrekt zu befüllen und hoffe nochmals auf Hilfe von den Profis hier :)

  • Ich verstehe deinen Code-Schnipsel nicht so ganz, allerdings scheint es mir so, als ob du $okey nicht richtig befüllst, was du ja auch schon selber angedeutet hast.
    Vielleicht hapert es ja auch mit dem Verständnis von AutoIt-Operatoren. Der Operator & (kaufmännisches Und) ist der Verkettungs-Operator. Er wird nur zum Verbinden von zwei Strings genutzt. Im Falle einer sogenannten kombinierten Zuweisung im Stil von $a &= $b wird also einfach $b an $a angehängt. Diese Operation hat rein gar nichts mit Arrays zutun! Wenn du etwas zu einem Array hinzufügen willst, benutzt du am besten einfach _ArrayAdd. Das ist zwar von der Performance her nicht so gut, allerdings spielt das in deiner Problemstellung keine Rolle.

    Das mit den zwei Arrays war auch nur ein Beispiel, um den Vorgang ohne SQLite-Datenbank zu veranschaulichen. Du kannst das Schema fast 1:1 in ein Beispiel mit einer Schleife plus FetchData übertragen:

    Abgeändertes Beispiel aus dem 1. Post (ungetestet)
    [autoit]


    ;Am Skriptanfang
    $oDict = ObjCreate("Scripting.Dictionary")

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

    _SQLite_Query($hDB, "SELECT subject,text,key From texte WHERE active='1'", $aQuery)
    ; Auslesen der nächsten Zeile
    _SQLite_FetchData($aQuery, $aRow, False, True)
    For $fi = 0 To UBound($aRow) - 1
    $aRow[2] = StringLower($aRow[2])
    $aRow[2] = StringReplace($aRow[2], "+", "")
    $aRow[2] = StringReplace($aRow[2], "strg", "^")
    $aRow[2] = StringReplace($aRow[2], "shift", "+")
    $aRow[2] = StringReplace($aRow[2], "alt", "!")
    $oDict($aRow[2]) = $aRow[1] ;((key)) : text
    HotKeySet($aRow[2], "ssf")
    Next
    _SQLite_Close()
    _SQLite_Shutdown()

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

    Func ssf()
    MsgBox(0, "Test", $oDict(@HotKeyPressed))
    EndFunc ;==>ssf

    [/autoit]
  • Nachdem ich nun den gesamten Tag nur für dieses eine Problem aufgeopfert habe, habe ich es schlussendlich geschafft :D

    Dein letzter Code Vorschlag war soweit schon richtig, nur die Schleife war die falsche. Ich musste das ganze in eine While, anstatt in eine For Schleife setzen.

    Der funktionierende Code sieht nun so aus:

    Der funktionierende Code
    [autoit]


    ;Am Skriptanfang
    Global $oDict = ObjCreate("Scripting.Dictionary")
    _SQLite_Query($hDB, "SELECT text,key From texte WHERE active='1'", $aQuery)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($aQuery, $aRow, False, False) = $SQLITE_OK
    ;$aRow[2] = StringLower($aRow[2])
    $aRow[1] = StringReplace($aRow[1], "+", "")
    $aRow[1] = StringReplace($aRow[1], "STRG", "^")
    $aRow[1] = StringReplace($aRow[1], "ALT", "!")
    $aRow[1] = StringReplace($aRow[1], "Shift", "+")
    $oDict($aRow[1]) = $aRow[0] ;((key)) : text
    HotKeySet($aRow[1], "ssf")
    WEnd
    _SQLite_QueryFinalize($aQuery)
    _SQLite_Close()
    _SQLite_Shutdown()

    [/autoit]