Entwickler-Ecke
Windows API - GetKeyboardState nicht eineindeutig???
Simon Joker - Do 20.11.03 14:27
Titel: GetKeyboardState nicht eineindeutig???
Hi
ich habe ein seltsammes Verhalten von GetKeyboardState festgestellt. Ich wollte eindeutig feststellen, welche Tasten dedrückt gehalten werden. Dazu habe ich GetKeyboardState verwendet.
Einfaches Testproggie
ein Timer -> kleines Intervall
ein Label
Timerevent:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFormMain.Timer1Timer(Sender: TObject); var i:integer; S:String; Keys:TKeyboardState; begin GetKeyboardState(Keys); S:=''; for i:=0 to 255 do if (Keys[i] shr 7 =1) then S:=S+'/'+IntToStr(i); Label1.Caption:=s; end; |
So jetzt einfach mal testen. Die ersten 3, 4 Tasten werden korrekt erkannt! Drückt man aber mehr, treten immer mehr Fehler auf. Manche werden erkannt, manche nicht! Ab 6,7 Tasten sind Fehler nicht mehr zuvermeiden.
Die Kombinationen, der erkannten Tasten scheint abhängig von der Tastatur zusein. Das bringt mich auf den Verdacht, daß es ein physikalisches Problem beim Messen der Tastendrücke ist. Aber ich kann mich irren, deshalb die Frage.
Kennt jemand eine Methode, mit der man beliebig viele Tasten erkennen kann?
Andreas Pfau - Sa 29.11.03 14:26
Hallo,
schon mal 'ne Tastatur aufgeschraubt? Ich habe mal apfelsaft drübergleert, also bliebt mir nix anderes übrig... zur Sache: Da ist ein IC drin, mit 40-50 Pins, einige davon für das Kabel, dann für die LEDs... da bleiben nicht allzuviele für dei tasten übrig. Eingie Tasten, die logischerweise nicht gleichzeitig gedrückt werden (z.B. die Cursortasten) sind so verdrahtet, dass sie nicht gleichzeitig abgefragt werden kann - da heißt es, wer zuerst kommt, mahlt zuerst, ab eine gewissen anzahl Tasten (~5) wird jede weitere ignoriert. Und ich schätze mal, dass Windows auch ab 5 Tasten dicht macht, aber das ist nir eine Vermutung.
Auf jeden Fall kannst du da nix machen. Wozu auch? Wo braucht man so viele Tasten? Dei meisten brauch man in Ego-Shootern (denke ich mal). Aber mehr als laufen, strafen, springen und schießen kann man gleichzeitig eh' nicht. Und man kann auch maximal in 2 Richtungen gleichzeitig laufen.
Sorry, aber ich denke, da ist nix zu machen. Wozu brauchst du denn so viele Tasten?
patrick - Mo 01.12.03 10:31
eindeutig ein tastatur problem.
der controller-ic für die tastatur macht dicht und\oder kommt nicht mehr hinterher und schickt irgendwelche daten die unter umständen zu fehlern führen.
kann mann nichts machen (außer weniger tasten zu benutzen)
Simon Joker - Mo 01.12.03 12:37
Hi Andreas & Patrick
ich habe mich jetzt etwas durch die Datenblätter und Spezifikationen gelesen. Das Problem liegt grundsätzlich in der Meßmethode über eine Spannungsmatrix und in der Beschränkung des Keybuffers der IC-Controllers.
Zum Verständnis die Theorie. ;-)
Meßmethode:
Die einzelnen Tasten werden nicht einzeln abgefragt! Das wäre zu teuer und aufwendig.
Es wird eine Spannungsmatrix verwendet. Die sieht ungefär so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| X1 X2 X3 X4 X5 | | | | | Y1---A---B---C---D---E---............ | | | | | Y2---F---G---H---I---J---............ | | | | | Y3---K---L---M---N---O---............ | | | | | |
(X & Y sind die Messkontakte.)
Jede Dimension ist auf eine Folie gedruckt und ein Tastendruck löst einen Kontakt zwischen den Dimensionen aus. Über den fliesenden Strom wird dann ermittelt welche Tasten gedrückt sind.
Wenn jetzt viele Tasten gedrückt sind, bricht die Spannung zusammen. Messung im Ar***! Das erklärt auch die unterschiedliche Anzahl der maximalen Tastenzahlt in Abhängigkeit der Kombination. Je nach Position in der Matrix werden einzelne Stränge mehr belastet. Im Beispiel wäre B-F-G kritischer als A-G-M.
In Anbetracht dieser Tatsache hat der Controler nur einen sehr kleinen Tastenbuffer von 8 oder 16 Byte. Jeder weitere Tastendruck geht immer verloren!
Tja damit ist die Idee einer billigen und einfachen Altarnative für einen I²C- oder CAN-Bus gestorben.
Noch einen Link zur Technik-Theorie von PS/2-Interfaces:
http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/Links.html
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!