| Autor |
Beitrag |
Delphi-Noobie
      
Beiträge: 31
|
Verfasst: Di 25.01.05 12:13
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
_________________ Was du heute kannst verschieben, das besorge lieber morgen.
|
|
jaenicke
      
Beiträge: 19343
Erhaltene Danke: 1753
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Hält's aus hier
Beiträge: 12
Win 98 SE, Win 2000, Win XP SP1, Win XP SP2, Win 2003 Server
D5 Ent., D7 Prof
|
Verfasst: 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
      
Beiträge: 19343
Erhaltene Danke: 1753
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 25.01.05 13:42
 Ich seh grad, dass ich genau den umgekehrten Fall verstanden hatte, sorry.
|
|
Delphi-Noobie 
      
Beiträge: 31
|
Verfasst: 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.
_________________ Was du heute kannst verschieben, das besorge lieber morgen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 25.01.05 16:23
Nimm DirectX oder OpenGL, diese Bibliotheken sind auf so was ausgelegt.
|
|
Delphi-Noobie 
      
Beiträge: 31
|
Verfasst: 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 
_________________ Was du heute kannst verschieben, das besorge lieber morgen.
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Di 25.01.05 17:22
Hast du schonmal an einen Tastatur-Hook gedacht?
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Delphi-Noobie 
      
Beiträge: 31
|
Verfasst: 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.
_________________ Was du heute kannst verschieben, das besorge lieber morgen.
|
|
Noop
Hält's aus hier
Beiträge: 12
Win 98 SE, Win 2000, Win XP SP1, Win XP SP2, Win 2003 Server
D5 Ent., D7 Prof
|
Verfasst: 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!)
|
|