Eine Art Hotkeymenü

  • hallo leute.
    hätte da ein kleines Problem.

    und zwar will ich in ein programm von mir optionen einbauen, sodass die user funktionen auf beliebige tasten legen können. ähnlich wie in jeden x-beliebigen spiel quasi.

    Erklärung am Spiel-Bsp:
    man klickt auf ein Label, nennen wir es mal "Springen" und dann kann man sich die "Springen"-Funktion auf eine Taste legen. d.h. die zuerst eingegebene taste wird der Hotkey, sagen wir mal "Space". Dann wird "Schleichen" angeklickt, wenn der User jetzt wieder "Space" auswählt soll es hier übernommen werden und bei "Springen" gelöscht.

    Die meisten werden ja sowas in der art kennen.
    Wichtig ist:
    -Nicht alle Tasten können verwendet werden (Alt, windows,... gehen nicht)

    Ich hab auch nen einigermaßen funktionierenden ansatz nur is das ganze sehr schlampig und kann bestimmt verbessert werden.

    Die vereinfachte version:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=
    GUICreate('Form1', 160, 90)
    $input1 = GUICtrlCreateInput('', 50, 16, 100, 21,

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

    BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    $erase = GUICtrlCreateButton('löschen', 16, 45, 129, 33, $WS_GROUP)
    $HE = GUICtrlCreateLabel('HE', 16, 16, 29, 24)
    GUICtrlSetFont(-1, 12, 400, 0, 'MS Sans Serif')
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $erase
    GUICtrlSetData($input1, '')
    Case $HE
    Pressed()
    EndSwitch
    WEnd

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

    Func Pressed()
    $dll = DllOpen("user32.dll")
    MouseUp("left")
    GUICtrlSetData($input1, '')
    GUICtrlSetState($HE, $GUI_DISABLE)
    GUICtrlSetState($erase, $GUI_DISABLE)
    While GUICtrlRead($input1) = ''
    For $i = 1 To IniRead(@ScriptDir & '\IsPressed.ini', 'General', 'keys', '124')
    If _IsPressed(IniRead(@ScriptDir & '\IsPressed.ini', $i, 'id', '00')) Then
    GUICtrlSetData($input1, IniRead(@ScriptDir & '\IsPressed.ini', $i, 'Anzeige', 'Error'))
    EndIf
    Next
    WEnd
    GUICtrlSetState($HE, $GUI_ENABLE)
    GUICtrlSetState($erase, $GUI_ENABLE)
    DllClose($dll)
    EndFunc

    [/autoit]

    Bin für jeden verbesserungsvorschlag dankbar

  • hubs fast vergessen:

    hier meine IsPressed.ini

    Spoiler anzeigen
  • Wie wärs damit:

    Die Speicherdatei (hier die .ini) in ein Array laden, mit _IsPressed den Hotkey abfragen und im Array danach suchen.
    Ist die Suche erfolgreich ->Meldung: "Hotkey wird schon für XY verwendet - Belegung ändern?"
    -> Ja: Array editieren - Nein: Return
    Ansonsten den Eintrag ins Array hinzufügen.

    Am Ende (Speicherbutton, Skriptende) das Array wieder zurückschreiben.
    Die .ini würde so aussehen:
    [Hotkey]
    Funktion=Hotkey

    Ein Listview zur Darstellung würde sich anbieten.
    Ein weiteres Array könnte die Systemtasten ausschließen.

  • ok danke schonmal für die idee mit dem array, werd des heute nachmittag umsetzten

    die systemtasten hab ich ja quasi schon ausgeschlossen, da in meiner ini unter Funktion bei diesen nA steht. diese wo nA drinsteht werd ich dann einfach übergehen.

    das mit dem listview werd ich wohl lassen weil ich finde dass es mit Buttons/Labels und Inputs besser aussieht. auch wenns vllt umständlicher is.
    aber wenn man die Labels usw als Array erstellt gehts schon.

    hat jemand noch nen vorschlag wie man die Pressed() Funktion verbessern kann?
    sie funktioniert zwar recht gut aber iwie gefällt sie mir nicht so wirklich...

    Ansonsten bleibt sie halt so:
    Never change a running System
    :D