none
Keydown selbst bei einem anderen Tastenaschlag weiter ausführen - wie? RRS feed

  • Frage

  • Moin.

    Ich habe folgendes: Ich möchte meinem Win10 es ermöglichen, die Tasten, die ich drücke, selbst bei einem neuen Tastenanschlag einer anderen Taste, weiter auszuführen. Verständnisbeispiel: Wenn ich die Leertaste drücke und dann, wenn mehrere Spaces entstehen, ich die "1" drücke, weiterhin Spaces entstehen. An für sich erlauben es ja diverse APIs die Tastatur abzufragen, ob eine Taste gedrückt ist, egal ob andere in der Zwischenzeit gedrückt worden sind. Games interessiert es ja nicht, ob man beim Sprinten die Feuertaste drückt oder sonstiges. Windows im Normalfall hingeghen schon.

    Liebe Grüße,

    Faeis.

    Sonntag, 22. Juli 2018 15:37

Antworten

  • Moin,

    Du hast Deine Frage im Prinzip schon selbst beantwortet: einige Programme (Spiele) reagieren unter Windows unterschiedlich auf Tasten-Events als andere. Es ist also keine Funktion von Windows, sondern von der jeweiligen Applikation, die Events so oder anders zu verarbeiten. Windows liefert fleißig jedes Event in eine Message Queue ein, aus der sich die Applikationen jeweils einen Reim darauf machen können.

    Somit würde das, was Du vorhast, bedeuten, die Logik aller Windows-Bestandteile zu verändern. Du kannst es gern als Feature Request bei UserVoice einstellen, wenn sich noch ein paar Tausend Leute melden und das upvoten, könnte sich Microsoft evtl. damit beschäftigen.

    Ich persönlich finde es schön, dass man eine klemmende Taste wenigstens für die jeweils aktuelle Applikation unterbrechen kann, indem man eine andere drückt.

    Nur aus Interesse: Woher kommt der Wunsch? Es gibt in Windows ja überhaupt nicht so viele Funktionen, die mit einer dauerhaft gedrückten Taste etwas anfangen können...


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert Faeis Sonntag, 22. Juli 2018 21:21
    Sonntag, 22. Juli 2018 16:05

Alle Antworten

  • probiere es einmal mit einer zweiter Tastatur. Vielleicht gehts damit

    Chris

    Sonntag, 22. Juli 2018 15:44
  • Moin,

    Du hast Deine Frage im Prinzip schon selbst beantwortet: einige Programme (Spiele) reagieren unter Windows unterschiedlich auf Tasten-Events als andere. Es ist also keine Funktion von Windows, sondern von der jeweiligen Applikation, die Events so oder anders zu verarbeiten. Windows liefert fleißig jedes Event in eine Message Queue ein, aus der sich die Applikationen jeweils einen Reim darauf machen können.

    Somit würde das, was Du vorhast, bedeuten, die Logik aller Windows-Bestandteile zu verändern. Du kannst es gern als Feature Request bei UserVoice einstellen, wenn sich noch ein paar Tausend Leute melden und das upvoten, könnte sich Microsoft evtl. damit beschäftigen.

    Ich persönlich finde es schön, dass man eine klemmende Taste wenigstens für die jeweils aktuelle Applikation unterbrechen kann, indem man eine andere drückt.

    Nur aus Interesse: Woher kommt der Wunsch? Es gibt in Windows ja überhaupt nicht so viele Funktionen, die mit einer dauerhaft gedrückten Taste etwas anfangen können...


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert Faeis Sonntag, 22. Juli 2018 21:21
    Sonntag, 22. Juli 2018 16:05
  • Dies geht z.B. in einer .Net-Anwendung mit der statischen Funktion:

    Keyboard.GetKeyStates(key)

    https://msdn.microsoft.com/de-de/library/system.windows.input.keyboard.getkeystates%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    Dies klappt natürlich nur, wenn deine Anwendung auch gerade im Focus der Tastatur ist.
    Somit kannst du jederzeit abfragen, ob eine oder mehrere Tasten gedrückt sind: IsKeyDown(), IsKeyUp().

    https://msdn.microsoft.com/de-de/library/system.windows.input.keyboard(v=vs.110).aspx

    Sonntag, 22. Juli 2018 19:17
  • @bfuerchau

    Die Antwort ist Sinngemäß meines Vorhabens technisch nicht die Antwort, die ich benötige. An für sich habe ich bereits mit anderen Anwendungen sowie selbst mit einer C# Applikation das Ziel erreicht. Allerdings ist dies im Sinne anderern Programme nunmal Third-Party Software und in meisten Fällen, zumindest meine, verboten. Ausgenommen die Software, die Standardmäßig beim Betriebssystem gegeben sind. Ansonsten wäre es korrekt.

    Liebe Grüße,
    Faeis

    • Bearbeitet Faeis Sonntag, 22. Juli 2018 21:31 Adressart hinzugefügt
    Sonntag, 22. Juli 2018 21:29
  • Dann wirst du nicht darum herumkommen, einen eigenen Tastaturtreiber zu entwickeln.
    Die Repeat-Funktion der Tastatur für einen Tastendruck (festhalten) ist nur solange aktiv, bis eine andere Taste gedrückt wird. Dies ist ein generelles Verhalten von Tastaturen. Ebenso lässt sich die Repeatgeschwindigkeit und der Delay individuell konfigurieren, so dass die Wiederholrate auf wenige Zeichen pro Sekunde beschränkt werden kann.

    Ich weiß ja nicht was du erreichen willst. Aber eine allgemeine Lösung für das gesamte System ist doch eher kontraproduktiv. Warum soll es also nicht reichen, innerhalb deiner Anwendung per Statusabfrage die gedrückten Tasten abzufragen? Zumal du ja auch noch einen Stack mitführen musst um Sequenzen abzufangen "A-Down, B-Down, C-Down, C-Up, X-Down, B-Up, X-Up, ...".

    Vielleich schaffst du es ja mit einem globalen Keyboard-Hook.

    Montag, 23. Juli 2018 08:23
  • @bfuerchau

    Das tiefer liegende Problem ist: ich wollte eine Lösung, die ohne weiteres möglich ist. Ohne jegliche Programmierung. Lediglich Konfigurationen am System. Dies ist der Fall, da ich dies für ein Videospiel "benötige" (der Mensch ist faul per se, wie intensiv variiert). Da ich weder der Entwickler dessen bin, noch in Kontakt mit denen stehe, kann ich nicht, ohne die Regeln bei denen zu brechen, die so vorgeschlagene Software (umsetzen und) anwenden.

    Für manche Funktionen gibt es ja auch quasi einen dauerhaften Hook, siehe die Feststelltaste. Mittels einer Einstellung rastet die Taste nach einigen Sekunden ein, sofern nicht abgestellt.

    Allgemein habe ich mich bereits damit vertraut gemacht mittels APIs andere Software Anwendungen dies erzielen können, doch ist dies eher eine Systemergänzung meinerseits, anstelle eines Boardmittels, welches nur aktiviert werden muss.

    Montag, 23. Juli 2018 14:47
  • Nun ja, ob das per .Net geht weiß ich nicht, aber mit C/C++ kann man sich per Keyboard-Hook einschalten.
    Das Hauptproblem ist jedoch, dass man sich dabei immer an den Anfang der Kette "einhackt". Startest du dein Programm vor dem Spiel, und das Spiel hackt sich da auch ein, erhält es den Hook vor dir.
    Startest du dein Programm nachdem Spiel, liegst du vorne und kannst die Tastatur-Nachrichten verfälschen.

    Du kannst also einen Hook konstruieren, der auf Key_Down seine Liste (siehe oben) aufbaut und dann Timergesteuert eigene Nachrichten einschiebt.
    Du kannst dabei leider nicht feststellen, welcher Prozess dann diese Nachrichten verarbeitet.

    Was ich nicht weiß, und auch nicht dokumentiert ist: wer ist für das Repeat zuständig.
    Windows oder der Tastaturtreiber.
    Das musst du ggf. erst mal ausprobieren. In der Nachricht WM_KEYDOWN, wird der Key in wParam und ob es sich um Repeat handelt im Bit 30 des lParam festgelegt.
    Kommt im Hook das Bit nicht vor, kann es Windows selber verwalten, dann braucsht du nur laut deinem Stack in gewissem Abstand erneute WM_KEYDOWN's abgeben.

    Aber alles kann vergebens sein, da Spiele häufig eben nicht auf Nachrichten reagieren sondern z.B. direkt über eigene Timer die Tastatur (siehe auch oben) direkt selber steuern, denn sonst wären sie vom Repeatfaktor in Windows abhängig.


    Montag, 23. Juli 2018 16:51