Tastenkombination !?

  • Sooo....
    Ich weiß, das wurde schon 3 Millionen mal gefragt, aber ich habe nichts wirklich hilfreiches gefunden.
    Ich möchte nähmlich, dass beim Drücken einer vom Benutzer vorher durch eine Inputbox festgelegte Tastenkombination eine Funktion ausgeführt wird.
    Ich bekomme das einfach nicht hin.
    Und mit _IsPressed wüsste ich nicht wie ich die Buchstaben etc. in Hex konvertieren könnte, damit man sie mit _IsPressed benutzen könnte.
    Bitte helfen!
    Danke...

  • Ja klar, IsPressed ist einfach, aber ich kann ja in die InputBox nicht "364+124+342" reinschreiben, sondern "a+b+c".
    Und a+b+c müssten dann ja iwie in die Zahlen konvertiert werden.

  • Hmm, aber IsPressed ist auch nicht so ideal, da die Funktion sofort ausgeführt werden soll, daher müsse ich eine While Schleife ohne Sleeps nehmen, und dann is der PC so langsam X(

  • Ja, aber damit kann man nicht gleichzeitig "a+b" machen, sondern nur eine Kombination mit Strg, Alt und Shift + Buchstabe. :D

  • Hm, normale Tastenkombinationen basieren eigentlich auf einer Kombination aus {Shift;Alt;Win;Strg} + belibige Taste.
    Und solche Kombinationen lassen sich recht einfach mit Hotkeyset übersetzen:

    Spoiler anzeigen
    [autoit]

    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $hk = ""
    Guicreate("Tastenkombination", 200, 100)
    $Check1 = GUICtrlCreateCheckbox("Shift", 0, 0, 100, 25)
    $Check2 = GUICtrlCreateCheckbox("Strg", 0, 25, 100, 25)
    $Check3 = GUICtrlCreateCheckbox("Win", 0, 50, 100, 25)
    $Check4 = GUICtrlCreateCheckbox("Alt", 0, 75, 100, 25)
    GuiCtrlCreateLabel("+", 100, 0)
    $Combo1 = GuiCtrlCreateCombo("a", 150, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
    GUICtrlSetData(-1, "b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|1|2|3|4|5|6|7|8|9|0")
    $Button1 = GuiCtrlCreateButton("Übernehmen", 100, 50, 100, 50)
    Guisetstate()

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

    While 1
    sleep(40)
    $msg = GuiGetMsg()
    Switch $msg
    Case -3
    Exit

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

    Case $Button1
    _SetHk()
    EndSwitch
    WEnd

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

    Func _SetHk()
    HotkeySet($hk)
    $hk = ""
    If GUICtrlRead($Check1) = $GUI_CHECKED Then $hk &= "+"
    If GUICtrlRead($Check2) = $GUI_CHECKED Then $hk &= "^"
    If GUICtrlRead($Check3) = $GUI_CHECKED Then $hk &= "#"
    If GUICtrlRead($Check4) = $GUI_CHECKED Then $hk &= "!"
    $hk &= GuiCtrlRead($Combo1)
    HotkeySet($hk, "_test")
    EndFunc

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

    Func _test()
    MsgBox(0, "test", "test")
    EndFunc

    [/autoit]

    MfG,
    Fresapore

    Edit: Letzten Post übersehen :pinch:
    Aber ich sehe den Sinn auch nicht so ganz..

    Edit2:
    Wenn es sich nur um Buchstaben handelt: Man kann dann aber mit asc() den Ascii-Wert jedes Buchstabens erhalten, den mittels Hex() umrechnen, welcher dem "_Ispressed"-Code entspricht.

  • Sry, aber das hilft mir nicht so wirklich :)
    Das wusste ich ja schon, wie man es anwendet auch.

  • Ist jetzt nur so hingeklatscht, aber vllt ist ess das was du meinst:

    Spoiler anzeigen
    [autoit]

    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <misc.au3>

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

    Global $hex = "", $hex2 = ""
    Guicreate("Tastenkombination", 200, 100)
    $Combo1 = GuiCtrlCreateCombo("a", 0, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
    GUICtrlSetData(-1, "b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z")
    GuiCtrlCreateLabel("+", 100, 0)
    $Combo2 = GuiCtrlCreateCombo(" ", 150, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
    GUICtrlSetData(-1, "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z")
    $Button1 = GuiCtrlCreateButton("Übernehmen", 0, 50, 200, 50)
    Guisetstate()

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

    While 1
    sleep(40)
    $msg = GuiGetMsg()
    Switch $msg
    Case -3
    Exit

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

    Case $Button1
    _SetHk()
    EndSwitch
    If Not $hex = "" Then
    If _Ispressed($hex) Then
    If Not $hex2 = "" Then
    If _IsPressed($hex2) Then _test()
    Else
    _test()
    EndIf
    EndIf
    EndIf
    WEnd

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

    Func _SetHk()
    $let = GuiCtrlRead($Combo1)
    $asc = Asc($let) - 32
    $hex = Hex($asc)
    $let = GuiCtrlRead($Combo2)
    If $let = " " Then
    $hex2 = ""
    Return
    EndIf
    $asc = Asc($let) - 32
    $hex2 = Hex($asc)
    EndFunc

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

    Func _test()
    MsgBox(0, "test", "test")
    EndFunc

    [/autoit]

    Ich glaub ich seh den Wald vor lauter Bäumen nicht..:D

  • Ich erkläre es mal so:
    Ich habe eine Funktion:

    [autoit]

    Func _Show
    "Blablabla"
    EndFunc

    [/autoit]


    Und eine Inputbox, in die ich z.B. "g+a+e" reinschreibe, oder "d+a", sowas halt.
    Nun möchte ich, dass wenn g,a und e oder halt d und a gleichzeitig gedrückt werden, die Funktion _Show ausgeführt wird.

  • Schreib ein Array mit allen Zahlen und Nummern und der jeweiligen _isPressed ID, dann lässt du den Inhalt des Iputs nach + Splitten und im Array durchlaufen welches was ist.

    Bsp:

    a+b+c
    (Splitten)
    a
    b
    c

    Sind:
    41
    42
    43

    PS: Ein 2D Array wäre am sinnvollsten ;)

  • @ 4Soldier93

    Das hätte keinen Sinn, da Sleeps unter 10 ms sowieso auf 10 gesetzt werden, da es unter 10 nicht mehr möglich ist.

    @ Fresapore
    Wie schon gesagt geht es nicht mit _IsPressed, da es absolut keine Verzögerung haben darf.

    Und für die die es wissen wollen, nein, es ist KEIN BOT!
    Es ist ein Programm, um unseren Lehrer ein bisschen auszutricksen ;) Durch die Tastenkombination wird eine Funktion ausgelöst, in der Das ausgewählte Fenster komplett verschwindet, und wenn man wieder drückt, ist es wieder da. Nur auf Sachen wie "Alt+a" kommt er schon, der drückt einfach alles bis was passiert. Das ist uns nähmlich schonmal passiert :D Und darum will ich es etwas umschreiben.

  • also jetzt mal langsam....
    Das gleichzeitige drücken von "normalen" Tasten ist gar nicht möglich ;)
    Eben dazu gibt es ja Funktionstasten wie Shift, Strg, Alt, etc ...
    Der Controller in der Tastatur kann diese Tasten kombinationen gar nicht darstellen.
    D.h. sobald Du eine der "normalen" Tasten drückst wird diese auch schon an den PC geschickt.

    Deine Idee ist meines Erachtens nach gar nicht umsetzbar.
    Jetzt hab ich doch noch eine Idee...
    Die Auslösung der Funktion benötigt nacheinander 2 Tastenkombinationen ;)
    erste Kombination = Shift + Strg
    zweite Kombination = Shift + Space

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While Sleep (10)
    If _IsPressed("10", $dll) And _IsPressed("11", $dll) Then
    While Sleep(10)
    If _IsPressed("10", $dll) And _IsPressed("20", $dll) Then
    MsgBox(0,"_IsPressed", "End Key Pressed")
    ExitLoop 2
    EndIf
    WEnd
    EndIf
    WEnd

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

    DllClose($dll)

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Einmal editiert, zuletzt von Schnuffel (28. August 2011 um 20:36)

  • Warum soll das nicht gehen? ist wie ein makro z.b. ActivAid hat sowas da schreibt man mfg# und er schreibt dir das dann aus jetzt muss man ihn nur sagen das er stattdessen das fenster versteckt. Bin mir nicht sicher aber eventuell bekommste es damit hin: http://de.autohotkey.com/

    Ansonsten hätteste glaub ich keine andere wahl als _isPressed zu nehmen oder dir die HotKeySet umzuschreiben.

    Gruss DevFly

  • hab den Ansatz nochmal umgebaut für Erweiterung...

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")
    Global $code = "", $timer = TimerInit()
    While Sleep (10)

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

    If _IsPressed("10", $dll) And _IsPressed("11", $dll) And $code <> "1" Then $code &= 1 ; erster Code als Tastenkombination
    If _IsPressed("10", $dll) And _IsPressed("20", $dll) And $code = "1" Then $code &= 2 ; zweiter Code als Tastenkombination
    ; beliebig erweiterbar ...
    If TimerDiff($timer) > 3000 And $code <> "" Then ; maximale Zeitdauer zum Eingeben des Codes als Tastenkombination
    $code = ""
    $timer = TimerInit()
    EndIf
    If $code = "12" Then ExitLoop ; beenden, wenn Code stimmt
    WEnd

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

    MsgBox(0,"_IsPressed", "End Key Pressed")
    DllClose($dll)

    [/autoit]

    DevFly, für Deine Lösung brauchst Du einen Keyboard Hook.
    Das ist bei uns aber nicht gern gesehen, da das auch mißbraucht werden kann.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)