Systemweit ermitteln, ob ein "(" per Tastatur eingegeben wurde - UNABHÄNGIG vom Tastaturlayout

  • Das grobe Vorgehen ist uns allen klar.

    Wie Monthy Python sagen würden: "Mir nicht" :rofl:

  • Dank Lottich's Hinweis auf das Offensichtliche ist mir nun klar geworden, dass es die Gefahr des Keyloggers in diesem Thread nicht gibt! Auch ist mir klar geworden, dass ich Keylogger selbst und locker im Schlaf programmieren kann. Interessant! =O

    Aber das Wichtigste ist, dass mir das Problem klarer geworden ist. Es geht nicht darum, Keys zu loggen oder Tastendrücke zu überwachen, sondern einzig und allein darum, welche Taste(n) das "(" ergeben! Also vergesst die Keyloggerei, das kann ich selbst (werde es hier natürlich nicht veröffentlichen)! 8o Es geht lediglich darum, wie man Keys in Zeichen wandelt, unabhängig vom Keyboardlayout. Zum Beispiel: Wie ermittelt man per Code, welche Tasten auf einer Tastatur mit kurdischem Layout ein "(" ergeben?

    In Posting #9 habe ich einen Lücken-Code gepostet. Um bei diesem Beispiel zu bleiben, hier ein Pseudo-Code für die Lücke. Es braucht lediglich die markierte Stelle mit Pseudo-Code in echten Code gewandelt zu werden.

    AutoIt
    ; Funktion, die feststellt, ob der User die Taste(n) gedrückt hat, die bei
    ; seinem aktivem Keyboardlayout eine öffnende runde Klammer ergeben/schreiben.
    Func UserHasPressedKeysForParenthesis()
    
      ; Hier Lösung einfügen.
    
      If Taste_oder_Tastenkombi = "(" Then ; <= Pseudo-Code bitte durch echten Code ersetzen!
        Return True
      EndIf
    EndFunc

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Ich frag mich immernoch aus welchem Grund man systemweit mitschneiden sollte wann das Zeichen "(" gedrückt wurde. Was ist an diesem Zeichen so besonders und wozu brauchst du diese Erkennung?

    Ich verstehe, wenn man diese Erkennung in einem eigenen Textfenster benötigt, um z.B. eine Autovervollständigung in einer IDE zu ermöglichen. Aber das begrenzt sich dann ja auf (d)eine Anwendung und erfordert kein systemweites Keylogging bzw. allgemein kein Keylogging, da du einfach den Inhalt des Textfeldes überwachen und abgleichen könntest.

    Versteh das nicht falsch, ich bin einfach neugierig wozu man genau sowas braucht.

  • persönlich kann ich mir auch keinen vernünftigen Grund vorstellen, wo das sinnvoll einsetzbar wäre, aber was weiss ich denn schon ?!

    Darum hab ich mal ein wenig die Hilfe durchstöbert und siehe da: keine fertige Lösung, aber immerhin etwas worauf man aufbauen kann.

    Professor Bernd such doch mal in der Hilfe nach _WinAPI_RegisterRawInputDevices()

    Daraus kannst du dir vermutl alles nötige für dein Vorhaben abkupfern. Mir scheint es, als müsste lediglich die DLL-Struct geändert werden und folglich

    auch deren Auswertung. Ich hab die Includes durchstöbert und tatsächlich auch Konstanten für Keyboards gefunden, die dort sicher zum Einsatz kommen können.

    Aber nach dem Entdecken war dann auch Schluss für mich. Mir definitiv zu hohe Kunst.

    Grüße, Lo..

  • Ich frag mich immernoch aus welchem Grund man systemweit mitschneiden sollte wann das Zeichen "(" gedrückt wurde. Was ist an diesem Zeichen so besonders und wozu brauchst du diese Erkennung?

    persönlich kann ich mir auch keinen vernünftigen Grund vorstellen, wo das sinnvoll einsetzbar wäre, aber was weiss ich denn schon ?!

    Spielt es denn eine Rolle, wozu ich das brauche? Wenn ich es euch sage, gibts dann Lösungen? :P

    Ich verstehe, wenn man diese Erkennung in einem eigenen Textfenster benötigt, um z.B. eine Autovervollständigung in einer IDE zu ermöglichen. Aber das begrenzt sich dann ja auf (d)eine Anwendung und erfordert kein systemweites Keylogging bzw. allgemein kein Keylogging, da du einfach den Inhalt des Textfeldes überwachen und abgleichen könntest.

    So dicht dran, so dicht! :rock: Du brauchst nur "in einem eigenen Textfenster" durch "in einem fremden Textfenster" zu ersetzen und schon hast du deine Antwort. Wie ihr alle wisst, (oder nicht) zeigt mein CallTipViewer (derzeit nur) in PSPad einen CallTip an, wenn das Caret hinter der "(" einer Funktion steht UND man den Shortcut Ctrl+Shift+Space drückt. Das sieht dann so aus:

    Das soll erweitert werden, sodass ein CallTip auch automatisch angezeigt wird, wenn in PSPad ein "(" eingegeben wird. Da PSPad jedoch genau 0 Events zur Verfügung stellt, bleibt nur die Möglichkeit, in meinem CallTipViewer-Script eine systemweite Erkennung zu implementieren. Das mache ich zur Zeit ganz provisorisch mit

    If _IsPressed("10", $hDLL) And _IsPressed("38", $hDLL) Then <= wenn Shift+8 gedrückt wird.

    gefolgt von einer Prüfung, ob PSPad den Keyboard-Fokus hat. - Das funktioniert aber nur mit Tastaturlayouts, bei denen Shift+8 das "(" ergeben! Schon bei unseren Nachbarn in Frankreich funktioniert es nicht, wenn sie das FR Layout eingestellt haben. Ebensowenig bei Usern mit englischem, belgischem, kurdischem, ... Layout.

    Das habe ich bisher deshalb nicht geschrieben, weil die User unseres schönen Forums sich gerne in Nebensächlichkeiten verlieren und weit vom eigentlichen Thema abkommen. Z.B. obwohl BugFix schon in Posting #16 das Problem erkannt und eine Lösungs-Beschreibung gepostet hat, haben scheinbar alle anderen Probleme, das zu verstehen. :/ Vielleicht wirds nach dieser Erklärung besser. 8o

    Professor Bernd such doch mal in der Hilfe nach _WinAPI_RegisterRawInputDevices()

    Das habe ich mir nur oberflächlich angesehen, da es in der Tat sehr nach "hoher Kunst" aussieht. Ich vermute, dass auch damit im besten Fall eine Erkennung der gedrückten Tasten möglich wäre. - Dieser Käse ist aber schon lange gegessen, eine Erkennung der Tasten ist mir schon lange möglich und darum geht es nicht.


    Es geht darum zu ermitteln, welche Tasten ein "(" ergeben, unabhängig vom keyboardlayout?

    Boah, besser kann ich es nicht erklären. Wenns jetzt außer BugFix niemand verstanden hat, bin ich am Ende meiner Weisheit! :P

    Edit: Screenshot korrigiert.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    2 Mal editiert, zuletzt von Professor Bernd (9. Februar 2021 um 00:09)

  • Das habe ich bisher deshalb nicht geschrieben, weil die User unseres schönen Forums sich gerne in Nebensächlichkeiten verlieren und weit vom eigentlichen Thema abkommen. Z.B. obwohl BugFix schon in Posting #16 das Problem erkannt und eine Lösungs-Beschreibung gepostet hat, haben scheinbar alle anderen Probleme, das zu verstehen. :/

    Das mache ich zur Zeit ganz provisorisch mit

    If _IsPressed("10", $hDLL) And _IsPressed("38", $hDLL) Then <= wenn Shift+8 gedrückt wird.

    gefolgt von einer Prüfung, ob PSPad den Keyboard-Fokus hat. - Das funktioniert aber nur mit Tastaturlayouts, bei denen Shift+8 das "(" ergeben! Schon bei unseren Nachbarn in Frankreich funktioniert es nicht, wenn sie das FR Layout eingestellt haben. Ebensowenig bei Usern mit englischem, belgischem, kurdischem, ... Layout.

    Na, dann werde ich mich wohl auch noch mal in Nebensächlichkeiten verlieren :P:

    Warum folgst Du nicht BugFix Empfehlung, und erstellst eine Liste (Mapping) mit den verschiedenen Tastenkombinationen (abhängig vom jeweilgen KB-Layout).

    Welches Layout der User verwendet, lässt sich z.B. mit _WinAPI_GetKeyboardLayout ermitteln.

    Da man natürlich nicht alle möglichen Layouts der Welt testen kann verwende die, die Du bereits kennst (kann ja jederzeit erweitert werden).

    Sollte ein Layout nicht in Deiner Liste vorkommen, dann biete dem User die Option an seine Tastenkombinationen in z.B. eine kleine Textdatei einzutragen, die Du in dem Fall ausliest.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Warum folgst Du nicht BugFix Empfehlung, und erstellst eine Liste (Mapping) mit den verschiedenen Tastenkombinationen (abhängig vom jeweilgen KB-Layout).

    Da man natürlich nicht alle möglichen Layouts der Welt testen kann verwende die, die Du bereits kennst (kann ja jederzeit erweitert werden).

    Wie ich schon im Posting nach dem von BugFix geschrieben habe, ist das zum einen viel Arbeit, nur um am Schluss eine hardcodierte Tabelle mit selbst gesammelten Werten zu erstellen. Mein Bauchgefühl ist davon nicht begeistert. Aber wenn sich tatsächlich keine bessere Möglichkeit ergibt, bleibt nur das. :(

    Zum anderen denke ich, es muss doch eine programmierfähige Lösung geben, Windows macht das doch auch bei jedem einzelnen Fenster.

    Spoiler anzeigen

    Du kannst in der Windows Sprachenleiste mehrere Sprachen hinzufügen und dann für jedes einzelne Fenster bzw. Anwendung wählen, welche Sprache verwendet werden soll. Wenn du z.B. Notepad öffnest und drückt auf die Taste mit der 1, während du "deutsch" als Sprache eingestellt hast, wird im Notepad eine 1 geschrieben. Wenn du umschaltest auf "französisch" und drückst auf die Taste 1, wird im Notepad ein "&" geschrieben. Im Kurdischen erhälst du beim Drücken der Taste 1 ein "\" in Notepad, usw.

    So scheint mir z.B. die Windows-API-Funktion "VkKeyScanExA()" genau das leisten zu können, was ich suche: Man gibt das gesuchte Zeichen "(" ein und erhält einen virtuellen Key-Code und den Shift-Status, passend zum jeweiligen Tastaturlayout. Damit könnte ich in meinem Script mit _IsPressed() abfragen, wenn der ermittelte VKey (+evtl. Shift) gedrückt wird und meinen CallTip anzeigen! :party:

    Leider bin ich mir nicht ganz sicher, ob ich die Funktion richtig verstanden habe, und bräuchte zudem Hilfe, diese Funktion in einen DllCall() zu wandeln. Weiß jemand, wie das geht?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • So scheint mir z.B. die Windows-API-Funktion "VkKeyScanExA()" genau das leisten zu können, was ich suche. ... Leider bin ich mir nicht ganz sicher, ob ich die Funktion richtig verstanden habe, und bräuchte zudem Hilfe, diese Funktion in einen DllCall() zu wandeln. Weiß jemand, wie das geht?

    Möglicherweise : https://www.autoitscript.com/forum/topic/13…doing-it-right/

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wäre ich nicht schon fündig geworden, würde ich dir jetzt die Füße küssen. :love: (Aber erst die Schuhe ausziehen.) Dein Fund hat eventuell das, was dem anderen fehlt, um den Shift-Status rauszufiltern. Ich arbeite gerade daran, die Informationen zu vereinigen. :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Spielt es denn eine Rolle, wozu ich das brauche? Wenn ich es euch sage, gibts dann Lösungen?

    Ich denke, dass Du mehr Rückmeldungen kriegst, wenn die Benutzer dieses Forums einen Sinn darin sehen, sich in ein Problem zu vertiefen (und somit Zeit zu investieren) als wenn es sich um ein "Orchideenthema" handelt.
    Und da mehrere Poweruser bereits gepostet haben, dass sie keinen Anwendungsfall sehen und Du auch der erste bist, der dieses Problem postet, sind das doch sehr starke Indizien in Richtung Orchidee :)

    Im eng. Forum hättest Du ob dieser "Geheimniskrämerei" schon eine/einige sehr direkte Rückmeldungen erhalten. Von Valik's Zeiten rede ich da noch gar nicht :)

    Fazit: Je mehr Info, desto mehr hilfreiche Rückmeldungen!

  • Im eng. Forum hättest Du ob dieser "Geheimniskrämerei" schon eine/einige sehr direkte Rückmeldungen erhalten. Von Valik's Zeiten rede ich da noch gar nicht

    Das sehe ich anders. Siehe Posting #25 meine Aussage "in Nebensächlichkeiten verlieren". Und dein Beitrag ist ein Paradebeispiel dafür, mit "Orchideenthema" und "guck mal, was im EN Forum passiert wäre ..."

    Die Nebensächlichkeiten lassen wir mal. Ich habe den konkreten Anwendungsfall dargelegt, der Sinn und Zweck des Gesuchten erklärt. :)

    Edit: Sorry, bin gerade mitten drin eine mögliche Lösung zu erarbeiten und deshalb ein bisschen kurz angebunden gewesen. Hab zur Auflockerung ein Smilie gesetzt. 8o

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • "in Nebensächlichkeiten verlieren"

    Was ich gepostet habe sind keine Nebensächlichkeiten, sondern die Grundzüge effizienter Kommunikation.

    Ich habe den konkreten Anwendungsfall dargelegt, der Sinn und Zweck des Gesuchten erklärt.

    Bei effektiver und effizienter Kommunikation geht es nicht darum, was Du sagst oder schreibst, sondern was beim Empfänger ankommt. Und da mehrere Benutzer keinen Anwendungsfall sahen, habe ich meine Verbesserungsvorschläge gepostet.


    Just my 2 cents worth!

  • Ehrlich water, ich weiß jetzt nicht, was du von mir willst. =O Ich habe doch alles gemacht, was du schreibst. Was fehlt denn noch? :/

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Ehrlich water, ich weiß jetzt nicht, was du von mir willst. =O Ich habe doch alles gemacht, was du schreibst. Was fehlt denn noch? :/

    Nun, vermutlich ist es etwas verwirrend, dass du zum Einen schreibst:

    "CallTip" war nur zur Erklärung, wofür die Lösung benutzt werden kann,

    (Betonung auf kann)

    andererseits sagst du, dass dies genau der gewünschte Einsatzzweck ist.

    Das soll erweitert werden, sodass ein CallTip auch automatisch angezeigt wird, wenn in PSPad ein "(" eingegeben wird. Da PSPad jedoch genau 0 Events zur Verfügung stellt, bleibt nur die Möglichkeit, in meinem CallTipViewer-Script eine systemweite Erkennung zu implementieren.


    Insofern ist es wirklich besser aus dem gezielten Problem keine allgemeine Problematik ableiten zu wollen. Sonst ist man ruck-zuck beim XY-Problem.

    Dein Ansatz ist: Key

    Vielleicht ist der günstigere Weg tatsächlich: Char

    Es fehlt momentan nur noch das Wie.

    Deshalb würde ich mal die Fragestellung weiter fassen und dennoch spezifizieren:

    'Wie kann ich ein Ereignis auslösen, wenn das OS nach Auswertung einer Tastatureingabe das Zeichen "(" im Puffer hat?'

    Findet man den Einstiegspunkt um Char abzufragen, ist es völlig egal was im Vorfeld geschieht.

    • Offizieller Beitrag

    So scheint mir z.B. die Windows-API-Funktion "VkKeyScanExA()" genau das leisten zu können, was ich suche: Man gibt das gesuchte Zeichen "(" ein und erhält einen virtuellen Key-Code und den Shift-Status, passend zum jeweiligen Tastaturlayout.

    Das hört sich zumindest sinnvoll an.

    Mein Test erbrachte aber entweder total blödsinnige Ergebnisse oder keine (vkCode: 255).

    Kannst ja selbst damit probieren:

    Wobei das Problem evtl. beim Datentyp HKL des Keyboardlayouts liegt. Aufgrund der Beschreibung habe ich das als DWORD (LO word & HI word) interpretiert.

  • Probier mal das

    Bei dem hier kann man allerdings kein Keyboardlayout angeben.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Nun lass mich mal eben zusammenfassen welche Dinge du hast:

    1. Du hast einen funktionierenden Keylogger und kannst für jeden Tastendruck den vKey ermitteln

    2. Du hast eine Funktion um das gesetzte Keyboard Layout auszulesen und vermutlich wäre es auch simpel das Keyboard Layout auf beliebige andere Sprachen in einer Testumgebung festzulegen

    3. Du kannst prinzipiell die geloggten vKeys in ein eigenes Textfenster umleiten oder ggf. auch automatisiert alle 255 vKeys senden um diese mit dem gesuchten Zeichen "(" abzugleichen

    Daraus ergibt sich, dass du eine vKeyMap und Zuordnung zum Keyboardlayout automatisiert für hunderte Sprachen vorab erstellen und für spätere Wiederverwendung in deinem oder weiteren Scripten speichern könntest.

    Der einmalige Aufwand und Dauer solch eine Tabelle zu generieren dürfte sich in Grenzen halten und wäre dafür dann auch zuverlässig in der Zukunft einsetzbar.

  • Wie meinst du das?

    Zu 1: Ich habe keinen Keylogger, was ich habe ist _IsPressed().

    Zu 2. Die Funktion um das Keyboardlayout auszulesen ist _WinAPI_GetKeyboardLayout().

    Zu 3: Geloggte vKeys in ein eigenes Textfenster umleiten - DAS fehlt mir absolut. Wenn ich das könnte, hätte ich den Thread nicht öffen brauche.

    Wie leitet man denn vKey in ein eigenes Textfenster um?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.