Kombination von Tastatureingaben richtig abfangen

  • Hallo zusammen,

    ich versuche momentan, eine Art Mini-WinCompose in AutoIt zu schreiben, da bei meiner Arbeit aus Sicherheitsgründen zwar AutoIt-Skript erlaubt sind, unbekannte Programme aber nicht ohne vorherige Prüfung freigegeben werden.

    Folgenden Code habe ich dafür bisher geschrieben:

    Meistens funktioniert das auch recht gut. Allerdings komme ich immer mal wieder in Szenarien, wo ich entweder per [Feststelltaste]+["]+[a] zuerst wie geplant das "ä" erzeuge, anschließend meine [s]-Taste allerdings zu einem "ß" führt - und zwar solange, bis ich nochmal per [Feststelltaste]+[s] selbst ein "ß" getippt habe.

    Zum anderen bleibt scheinbar manchmal die Feststelltaste "hängen" und nach dem Schreiben von Umlauten werden sämtliche Tasten als Großbuchstaben abgeschickt.

    Da ich noch Anfänger bei AutoIt bin, kann ich mir das erste Problem noch halbwegs damit erklären, dass die Feststelltaste die Compose-Sequenz initialisiert und dann nicht richtig entfernt/vervollständigt wird. Beim zweiten Problem bin ich allerdings komplett ratlos, zumal der Fehler auch nicht immer auftritt, sondern nur immer mal wieder. Wird da vielleicht die Umschalttaste manchmal wirklich ans System weitergeleitet und nur manchmal abgefangen? Und wenn ja, wie kann ich sicherstellen, dass die Umschalltaste jedes Mal abgefangen und zmdst. nach dem Senden der Tasten wieder deaktiviert wird?

    Danke für eure Hilfe :)

    • Offizieller Beitrag

    Unabhängig von dem Problem erschließt sich mir nicht, was du überhaupt bezweckst.

    Du definierst Hotkeys um damit Tastendrücke per Send() unsicher und unzuverlässig ans System zu senden (bzw. das Fenster, das gerade im Moment des Sendens den Fokus hat - kann mal schnell irgendein aufpoppendes Nachrichtenfenster sein). Welchen Sinn soll das ergeben, wenn du Tastendrücke durch das Drücken von Tasten simulierst?:/

    • Offizieller Beitrag

    Sieht aus als würde jemand versuchen mit einer Tastatur, die keine Umlaute hat (z.B. EN-Layout), diese über einen Umweg zu simulieren.

    Das wäre das klassische XY-Problem. Lösung: Bildschirmtastatur verwenden bei gelegentlicher Nutzung. Bei dauerhafter Nutzung sollte man vielleicht zur richtigen Tastatur greifen. :P

  • Sieht aus als würde jemand versuchen mit einer Tastatur, die keine Umlaute hat (z.B. EN-Layout), diese über einen Umweg zu simulieren.

    Ich würde empfehlen, ein eigenes Layout zu erstellen. Das sollte deutlich einfacher/sinnvoller sein, wenn dies tatsächlich das Ziel ist.

    Ich nutze ebenfalls eine Tastatur mit US-Layout und kann nur empfehlen, das International Layout ohne DEAD Keys zu verwenden.

    Ansonsten kann man mit dem Tool "Keyboard Layout Creator" von Microsoft nen eigenes Layout erstellen.

    MfG, Kanashius.

  • Moombas hat das Problem richtig erkannt. Ich nutze ein US-Tastaturlayout, da sich hiermit weitaus komfortabler programmieren lässt, arbeite aber in einem teilweise deutschsprachigen Unternehmen und will die Kollegen nicht mit "ausgeschrieben" Umlauten (ae, oe, ue) nerven.

    Meine aktuelle Lösung ist es daher, für Umlaute kurz zum deutschen Layout zurück zu springen. Das ist auf Dauer aber nervig und manchmal vergesse ich, wieder zurück zu wechseln, daher mag ich die vor allem aus der Linux-Welt bekannte Möglichkeit der Compose-Taste lieber, um nur einzelne Sonderzeichen über Tastenkombinationen zu senden.

    Da es sich um ein Unternehmensgerät handelt, kann/darf ich leider keine neuen Tastaturlayouts (und auch keine Programme wie Portable Keyboard Layout) installieren.

    Mir ist bewusst, dass es sich um ein eher exotisches Problem handelt, daher nochmal danke an alle, die sich bereits beteiligt haben :)

  • Was spricht dagegen bei der IT anzufragen, das du ein anderes Layout zusätzlich installieren darfst? Ich meine das ist ja keine Sicherheitslücke oder so die du schaffst, erst recht zu irgendwelchen eigens geschriebenen Programmen -.-

  • Die IT-Abteilung hat momentan noch einige Dutzend offene Anfragen bzgl. neuer Programme zusätzlich zu dem normalen Workload. Klar könnte ich da jetzt ein Ticket aufmachen und hoffen, dass es in ein paar Monaten bearbeitet wird, aber da AutoIt bereits freigeschaltet war, dachte ich mir, dass ich mir (und denen) die Arbeit sparen und gleichzeitig in eine neue Skriptsprache reinschnuppern kann. Mit AutoHotkey hatte ich mal was ähnliches erstellt, was recht schnell gemacht war und gut funktioniert hat. Ich war davon ausgegangen, dass es sich mit AutoIt ähnlich verhalten würde, da ja beide grob gesagt für Automatisierungsaufgaben gedacht sind.

    Wenn es mit AutoIt zu aufwändig ist, wird es aber wohl auf das Ticket rauslaufen, danke für eure Hilfe :)

    • Offizieller Beitrag

    wie kann ich sicherstellen, dass die Umschalltaste jedes Mal abgefangen und zmdst. nach dem Senden der Tasten wieder deaktiviert wird?

    Das geht sauber mit einem Hook.

    Das Verwenden von Capslock ist aber ungünstig. Ich habe zum Initialisieren des Layoutwechsels die Kombination Strg+- verwendet, für das US-Layout wäre das dann Ctrl+\, musst du im Code aktivieren (Zeile 14). Kann man schnell mit zwei Fingern einer Hand betätigen.

    Mit dem Hotkey wird der Layoutswitch für die Tasten (a,o,u,s) aktiviert und beim Lösen der Tasten deaktiviert:

    Code
    a -> ä
    o -> ö
    u -> ü
    s -> ß
    Shift + a -> Ä
    Shift + o -> Ö
    Shift + u -> Ü

    Wird der Hotkey versehentlich betätigt, kann durch nochmaliges Betätigen der aktivierte Modus wieder zurückgesetzt werden.

    Eventuell ist es sinnvoll in die Hotkey-Funktion (_ActivateLayoutSwitch) mit einzufügen, dass du eine visuelle Benachrichtigung (z.B. Icon in der Taskleiste) über den aktiven Modus hast.


    EDIT:

    Die "VKCodeConstants.au3" brauchst du ja auch - jetzt angehängt.

    EDIT 2:

    Habe jetzt noch die normale Funktionalität der Capslock Taste berücksichtigt für Groß-/Kleinschreibung der Umlaute.

  • Wow, vielen Dank für den Code! Das sieht für mich jetzt so aus, als hätte ich da noch lange ausprobieren können. Dein Code scheint ja nur noch minimale Gemeinsamkeiten mit meinem zu haben :D

    Ich werde deinen Code mal studieren und ggf. noch weiter darauf aufbauen, falls mir weitere Features auffallen, die noch praktisch wären, wie das visuelle Feedback, das du schon angesprochen hast.

    • Offizieller Beitrag

    Ich habe die visuelle Anzeige noch mit integriert. Dazu erzeuge ich ein Fenster, das bei aktiviertem Layout Modus im nicht sichtbaren Desktopbereich inaktiv angezeigt wird (stiehlt also nicht den Fokus). Dadurch erscheint in der TaskBar eine Fläche mit dem Icon der GUI (habe ich angehängt, Icon kann ich nicht anhängen, deshalb als zip). Beim Beenden des Modus wird die GUI deaktiviert und somit verschwindet die Anzeige wieder aus der TaskBar.

    • Offizieller Beitrag

    wie das visuelle Feedback, das du schon angesprochen hast.

    Wie du siehst, hatte ich das gerade fertig, als du gepostet hattest.

    Übrigens bleibt auch der Weg über Direkteingabe des ASCII-Codes (bzw. ANSI) mit der Zifferntastatur des NUM-Blocks, musst dir nur ein paar Zahlen merken 8o :

    Code
    Ä    Ctrl+Alt+NumPad(0196)    +32    = ä        Ctrl+Alt+NumPad(0228)
    Ö    Ctrl+Alt+NumPad(0214)    +32    = ö        Ctrl+Alt+NumPad(0246)
    Ü    Ctrl+Alt+NumPad(0220)    +32    = ü        Ctrl+Alt+NumPad(0252)
    ß    Ctrl+Alt+NumPad(0223)