kann man Tastendrücke abfangen?

  • Also ich hab ein problem:

    Also ich will ein Programm machen dass die Zwischenablge langsam ausgibt wenn man auf den normalen Buchstaben Tasten schreibt (mit Send ausgeben) so soll man einfach irgendeinen Schwachsinn schreiben können aber das richtige erscheint. Dabei soll nartürlich nicht der sinnlose Schwachsinn (siadfgasozudfgsld) dastehen. sondern diese Tasten (alle Buchstaben) sollen abgefangen werden sodass man den Text nur mit Return und Backslash verändern kann. Puuh lange Geschichte

    Spoiler anzeigen
    [autoit]

    #Include <string.au3>
    #include <Misc.au3>
    HotKeySet("^!{F1}", "change")
    HotKeySet("^!{F2}", "raus")
    $change = 0
    $Zeichen = "a"
    $p = 1
    $i = 0
    global $taste = ""
    $dll = DllOpen("user32.dll")
    $old = ""
    $new = ""
    $1 = ""
    $on = 0
    $text = 0
    $ztext = ClipGet()

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

    ToolTip($taste)

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


    While $p < StringLen($ztext)

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

    If Taste() = True and $p <= stringLen($ztext) and $change = 0 THen
    $p = $p +1
    ;MsgBox(1,"",$taste)
    $Zeichen = StringMid ( $ztext, $p , 1 )
    ;MsgBox(1,"","Der Stringteil ist " & $Zeichen & "! Die Taste ist " & $taste & "! " )
    Sleep(10)
    Send($Zeichen,1)

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

    Endif

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

    Wend

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

    Func change()

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


    EndFunc

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

    Func _GetKeyPressed($iOption = 1)
    For $i = 0 To 255
    If (_IsPressed(Hex($i, 2), $dll)) Then
    Select
    Case $iOption = 0
    Return Hex($i)
    Case $iOption = 1
    Return $i
    Case $iOption = 2
    Return Chr($i)
    EndSelect
    EndIf
    Next
    SetError(1)

    EndFunc ;==>_GetKeyPressed

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

    Func raus()
    MsgBox(0, "", $taste)
    Exit
    EndFunc ;==>raus

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

    Func Taste()
    $taste = _GetKeyPressed(2)

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

    If $taste <> "" Then
    Return 1
    Endif
    EndFunc

    [/autoit]

    Vielleicht könnt ihr mir ja weiter helfen


    [Edit BugFix: Spoiler und AutoIt-Tag gesetzt]

    Einmal editiert, zuletzt von BugFix (21. Mai 2009 um 09:48)

  • schau dir mal in der hilfe

    [autoit]

    _IsPressed

    [/autoit]

    an und die tabelle dazu müsstest du eben so programmieren das der in ner schleife immer alle abfrägt

    fällt mir auf die schnelle auch nix besseres ein

  • Man könnte die Liste in eine .txt machen.
    Diese dann mit FileRead auslesen und mit Stringsplit aufteilen.
    Dann mit einer For - Next schleife die Key Prüfen.

  • Dass versteh ich jetzt nicht ganz
    Denn man schreibt ja dann immernoch Schwachsinn in den Text.

  • Habs dir schnell gemacht.
    Das script erkennt, welche Taste gedrückt wurde.
    Im moment gibt es nur die Kennung der taste, also die ID zurück, aber damit kann man gut weiter arbeiten:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    $dll = DllOpen ("User32.dll") ; Öffnet die User32.dll
    While 1 ; Die scheife ( start )
    $FileRead = FileRead (@ScriptDir & "\KeyList.txt") ; Liest die .txt aus.
    $Split = StringSplit ($FileRead, ";") ; teilt den Text der .txt mit dem trennzeichen ; auf
    For $i = 1 To $Split[0] Step 1 ; Durschläuft die Schleife von der Ersten ID bis zur letzten ( $Split[0] gibt die Anzahl der Teilsptrings zurück )
    If _IsPressed ($Split[$i], $dll) Then ; Prüft, ob eine der Tasten gedrückt wurde
    MsgBox (0, "Taste", "Es wurde die Tase mit der Kennung: " & $Split[$i] & " gedrückt!") ; Das, was passieren soll, wenn die taste gedrückt wurde...
    EndIf
    Next ; Hier beginnt die For schleife von vorne, bis alle zahlen durch sind...
    WEnd ; Die schleife ( Ende )

    [/autoit]

    Dazu diese .txt runterladen:

    2 Mal editiert, zuletzt von Commander21 (21. Mai 2009 um 14:00)

  • Aha interressant.. und was spricht dagegen? :D ->

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <String.au3>
    While 1
    For $k = 1 To 256
    If _isPressed(Hex($k, 2)) Then
    MsgBox(0,"","Taste: "&_HexToString(Hex($k, 2))&" /Hex: "&Hex($k, 2))
    sleep(100)
    Endif
    Next
    Wend

    [/autoit]

    Einmal editiert, zuletzt von ChaosKeks (21. Mai 2009 um 14:53)

  • I.wie gibt das die falschen tasten zurück...
    drücke ich z.B. NumPad 5, dann gibt er mir "e" zurück.

    an was könnte das liegen?

    PS: Finde deine version etwas kompliziert ^^
    aber das ligt daran das ich _Hextostring und Hex noch nicht kenne ^^

  • Eh ja an den Tasten, die normalerweise mit {-Klammern (bzw. Tasten mit mehr als 1 Buchstaben) gechrieben werden, muss man noch FineTuning machen aber der Rest geht..
    und ich finde die Variante unkomplizierter als immer eine Textdatei rumschleppen zu müssen 8|

  • Dann schreib die TastenIDs doch in ne Variable: ^^

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    $dll = DllOpen ("User32.dll")
    $String = "01|02|04|05|06|08|09|0C|0D|10|11|12|13|14|1B|20|21|22|23|24|25|26|27|28|29|2A|2B|2C|2D|2E|30|31|32|33|34|35|36|37|38|39|41|42|43|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|53|54|55|56|57|58|59|5A|5B|5C|60|61|62|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|6F|70|71|72|73|74|75|76|77|78|79|7A|7B|7C|7D|7E|7F|80H|81H|82H|83H|84H|85H|86H|87H|90|91|A0|A1|A2|A3|A4|A5"
    $Split = StringSplit ($String, "|")
    While 1
    For $i = 1 To $Split[0] Step 1
    If _IsPressed ($Split[$i], $dll) Then
    MsgBox (0, "Taste", "Es wurde die Tase mit der Kennung: " & $Split[$i] & " gedrückt!")
    EndIf
    Next
    WEnd

    [/autoit]
  • Hmm... da verweise ich nur auf:

    Zitat

    [M]an schreibt ja dann immernoch Schwachsinn in den Text.

    _IsPressed blockiert ja nicht..
    Kann mich also nur der "Alle-Buchstaben-als-Hotkeys"-Variante anschließen.
    Würde dann in etwa so aussehen:

    Spoiler anzeigen
    [autoit]

    Global $text = ClipGet()
    Global $on = False

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

    ToolTip( 'Hotkey: F1 to Start/Stop From-Clip-Writing, ESC to exit', 0, 0 )
    HotKeySet( '{F1}', '_switch' )
    HotKeySet( '{ESC}', '_exit' )
    HotKeySet( '{F2}', '_print' )

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

    While True
    Sleep( 100 )
    WEnd

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

    Func _switch()
    $on = Not $on
    _hotkeys($on)
    EndFunc

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

    Func _hotkeys($bool)
    If $bool Then
    For $char = Asc('a') To Asc('z')
    HotKeySet( Chr( $char ), '_writeone' )
    Next
    Else
    For $char = Asc('a') To Asc('z')
    HotKeySet( Chr( $char ) )
    Next
    EndIf
    EndFunc

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

    Func _writeone()
    ;MsgBox( 0, '_writeone', @HotKeyPressed )
    _hotkeys( False )
    Send( StringLeft( $text, 1 ), 1 )
    _hotkeys( True )
    $text = StringTrimLeft( $text, 1 )
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    Func _print()
    MsgBox( 0, '', $text )
    EndFunc

    [/autoit]

    Wenn man aber zu schnell auf die Tasten haut, kommen immernoch Fehler mit in den Text.
    Aber als grobe Grundlage dürfte das so hinhauen...
    Sofern ich die Problematik richtig verstanden habe ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Ghost = Keylogger der Tastatur, Maus, Desktopbewegungen etc aufschreibt und per Email versenden kann.
    (Selbstgeschrieben :D )

    Ist allerdings illegal und daher poste ichs hier auch nicht^^

  • Ich dachte nicht dass ich mich auf illegalem Gebiet bewege.

    Ich muss limette leider recht geben, da ich auch glaube das _ispressed keine Tastendrücke abfängt.
    Aber leider habe ich im Moment nur wenig Zeit um es auszuprobieren.
    Aber ich bedanke mich bei euch für allen für die Hilfe. :)