Entwickler-Ecke
Windows API - Tastenverzögerung der tastatur abstellen/ umstellen???
Delphi-Noobie - Di 25.01.05 12:13
Titel: Tastenverzögerung der tastatur abstellen/ umstellen???
Hi,
Gibt es eine Möglichkeit Die Tastenverzögerung mit Delphi abzustellen oder umzustellen, da, wenn ich eine Taste dauerhaft gedrückt halte(z.B "a") zuerst ein "a" kommt und nach einer bestimmten zeit ganz viele "a's" hintereinander. Ich will aber, dass sofort dauerhaft "a's" kommen. Manuell kann man das ja umstellen unter Systemsteuerung -> Tastatur -> Doppelklick -> Verzögerung. Und ich verwende bei dem Programm nicht das Onkeydown event sondern Registerhotkey und die Procedure dazu (if msg.hotkey = ord(vk_space) then ...), hier zum Beispiel die Leertaste. Ein Timer möchte ich auch nicht verwenden :). kennt da jemand ne Lösung??
Ps: Is für ein Spiel, wo man auf der Leertaste schiessen kann.
Gruß
Delphi-Noobie
jaenicke - Di 25.01.05 12:55
Wie wärs mit Application.ProcessMessages in einer Schleife, die nach dem Schuss z.B. 1000 ms wartet?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var shooting: Boolean = False;
var tmpTime: Cardinal; begin if shooting then Exit; shooting := True;
tmpTime := GetTickCount; while tmpTime + 1000 > GetTickCount do Application.ProcessMessages; shooting := False; end; |
Durch das Application.ProcessMessages sollte das Spiel weiterlaufen...
Noop - Di 25.01.05 12:56
Warum kein Timer? Damit ginge es doch auch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure OnTimer(Sender: TObject); ... if (GetKeyState(Ord('A')) and (1 shl 31))<>0 then begin Caption:='A Gedrückt'; end else if (GetKeyState(VK_SPACE) and (1 shl 31))<>0 then begin Caption:='SPACE Gedrückt'; end else begin caption:=''; end; ... end; |
Oder auch andere Möglichkeit:
globales Array "keyz" definieren
beim OnKeyDown keyz[meinindex] auf 1 setzen, beim OnKeyUp keyz[meinindex] auf 0 setzen und dann kannst du im Spiel keyz[meinindex] abfragen: ist der auf 1, ist die Taste gerade gedrückt
jaenicke - Di 25.01.05 13:42
:oops: Ich seh grad, dass ich genau den umgekehrten Fall verstanden hatte, sorry.
Delphi-Noobie - Di 25.01.05 15:51
Ich kann kein Onkeydown verwenden, da ich nicht mit dem Formular arbeite, sondern ausschließlich mit Canvas auf der Desktopoberfläche. Dabei ist das Formular minimiert und onkeydown funzt nicht mehr. Ich habe diese Procedure um einen Tastendruck zu erkennen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
implementation
procedure TForm1.WMHotKey(var Msg : TWMHotKey); begin if msg.hotkey = ord(vk_space) then begin end; end; |
Kann man nicht irgendwas einbauen, dass kein Delay kommt in dieser Procedure ohne einen extra Timer verwenden zu müssen? Getkeystate klappt in dieser Procedure nicht, sondern nur in einem Timer :(, ob das auch Systemweit geht, weis ich nicht, habs nicht probiert. Also um genauer zu sein: Wenn die Leertaste gedrückt wird (siehe Procedure), dann create ein OBject(den Schuss) und bewege ihn in eine Richtung (in einer anderen Unit, die einen Timer erzeugt, damit der Schuss fliegt).
Also gibt es wirklich nur die Timer Methode, oder kann man doch an der Verzögerung drehen(manuell gehts doch auch)?
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Delete - Di 25.01.05 16:23
Nimm DirectX oder OpenGL, diese Bibliotheken sind auf so was ausgelegt.
Delphi-Noobie - Di 25.01.05 16:42
ich kenn mich mit derectX oder OpenGL net aus. Müsste ich da das ganze Prog umschreiben oder gibts da nur eine Procedure drin, die das macht? Nen Beispiel wäre net schlecht :roll:
wulfskin - Di 25.01.05 17:22
Hast du schonmal an einen Tastatur-Hook gedacht?
Delphi-Noobie - Di 25.01.05 17:50
Jo hab ich aber ich kenn den Hook nur im Zusammenhang damit, das man alle Tastendrücke abfangen kann zum Beispiel für einen keylogger. Wenn du ne Lösung mit nen Hook hast kannst du sie ja mal posten plz.
Noop - Mi 26.01.05 18:57
Sonst nutze GetASyncKeyState anstat GetKeyState.
Dieser Befehl funktioniert Systemweit, auch wenn die Anleitung es einem anders weiß machen will das es nur funktioniert, wenn das Fenster den Focus hat (praktisch ausprobiert!)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!