PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Virtual Keys


Elladan
2005-06-04, 19:06:26
Es gibt ja die Tastenbelegung der Tastatur auch als Virtualkey - Abfrage...

z.B:
VK_RETURN Enter (Schreibmachinentastatur und Ziffernblock)
VK_SHIFT Umschalttaste (links und rechts)
VK_MENU ALT-Taste (links und rechts)
VK_CONTROL Strg (links und rechts)
VK_BACK Rücktaste
u.s.w.
Tabellen finden sich zahlreiche, u.a. hier:
http://www.swissdelphicenter.ch/de/printcode.php?id=467
http://mitglied.lycos.de/ValentinC/lccwin32/Tutorials/04_keys.html


Frage: Gibt es die Virtual Keys für Buchstaben? (also w, a, s, d etc)


Falls nein...
Ich versuche, in Delphi in einer Procedur die Tastaturtasten auf Betätigung abzufragen:
if GetAsyncKeyState(VK_RIGHT)<>0 then ...
Das funktioniert leider nur mit diesen VK_Tasten, ich will jedoch, wie schon erwähnt, auch buchstaben-tasten (w,a,s,d) mit verwenden.
Kennt jemand hierzu eine Alternative? So, dass ich auch meine gewünschten Tasten abfragen kann? (die OnKeyPress und OnKeyDown - Events möchte ich nicht vewenden, da auch mehrere Tasten gleichzeitig gedrückt werden sollen, was bei diesen nicht möglich ist, da immer die zuletzt betätigte erscheint)

Danke,
Elladan

Demirug
2005-06-04, 19:36:06
Ja es gibt auch VK Codes für die Buchstaben Tasten.

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp?frame=true

Was da abfragen von mehrern gleizeitig gedrückten Tasten angeht muss man allerdings sehr vorsichtig sein. Viele Keyboards sind technisch nicht dazu in der Lage bestimmte Kombinationen zu erkennen.

Elladan
2005-06-04, 19:42:32
Ja es gibt auch VK Codes für die Buchstaben Tasten.

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp?frame=true

Was da abfragen von mehrern gleizeitig gedrückten Tasten angeht muss man allerdings sehr vorsichtig sein. Viele Keyboards sind technisch nicht dazu in der Lage bestimmte Kombinationen zu erkennen.

Vielen Dank!

zeckensack
2005-06-04, 19:55:19
(die OnKeyPress und OnKeyDown - Events möchte ich nicht vewenden, da auch mehrere Tasten gleichzeitig gedrückt werden sollen, was bei diesen nicht möglich ist, da immer die zuletzt betätigte erscheint)Da solltest du nochmal drüber nachdenken :)

Du kannst dir ein Array mit bools anlegen, das für jede (für dich interessante) Taste den aktuellen Status speichert. In den Event-Handlern setzt du dann das passende bool in dem Array, oder du setzt es zurück.
Diese Methode ist sehr wohl dafür geeignet, mehrere gleichzeitig gedrückte Tasten zu erkennen. Die KeyDown-Events kommen dann halt nacheinander an, aber die bools bleiben ja so lange gesetzt, bis die entsprechenden KeyUp-Events bearbeitet werden.

Auf die Weise hast du einen vollwertigen Ersatz für GetAsyncKeyState. Wenn ich mir Demirug's Warnung durch den Kopf gehen lasse, ist es vielleicht sogar besser :|

Elladan
2005-06-04, 20:08:31
Wie könnte ich das Loslassen einer Taste abfragen? Bei OnKeyUp wird nur key = word akzeptiert...?

Demirug
2005-06-04, 20:14:48
Da solltest du nochmal drüber nachdenken :)

Du kannst dir ein Array mit bools anlegen, das für jede (für dich interessante) Taste den aktuellen Status speichert. In den Event-Handlern setzt du dann das passende bool in dem Array, oder du setzt es zurück.
Diese Methode ist sehr wohl dafür geeignet, mehrere gleichzeitig gedrückte Tasten zu erkennen. Die KeyDown-Events kommen dann halt nacheinander an, aber die bools bleiben ja so lange gesetzt, bis die entsprechenden KeyUp-Events bearbeitet werden.

Auf die Weise hast du einen vollwertigen Ersatz für GetAsyncKeyState. Wenn ich mir Demirug's Warnung durch den Kopf gehen lasse, ist es vielleicht sogar besser :|

Mit KeyDown und KeyUp bekommst du das gleiche Problem. Da die meisten Keyboards aus Kostengründen nicht jede Taste einzelen angebunden haben sondern eine Matrix benutzen kommt es dazu das bestimmte Kombinationen einfach nicht erkannt werden.

Was hast du eigentlich gegen GetAsyncKeyState? OK ich nehme ja auch lieber DirectInput für diesen Job aber ich sehe nicht was gegen GetAsyncKeyState spricht.

zeckensack
2005-06-04, 22:40:38
Mit KeyDown und KeyUp bekommst du das gleiche Problem. Da die meisten Keyboards aus Kostengründen nicht jede Taste einzelen angebunden haben sondern eine Matrix benutzen kommt es dazu das bestimmte Kombinationen einfach nicht erkannt werden.

Was hast du eigentlich gegen GetAsyncKeyState? OK ich nehme ja auch lieber DirectInput für diesen Job aber ich sehe nicht was gegen GetAsyncKeyState spricht.Ich habe nicht wirklich was gegen GAKS. Es kommt halt darauf an, was man machen möchte.
Wenn man die Events sowieso schon behandelt, dann spart man sich das spätere Pollen.

Wenn man primär auf Events (oder Timer oder sowas) reagiert, dann ist das sehr günstig.

Wenn man natürlich den klassischen "main loop" fährt alawhile (1)
{
if (ich_will_endlich_aufhören) break;
friss_cpu();
}... dann ist's eigentlich egal.