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;

  //Schuss anzeigen etc.

  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

// im oncreate -> RegisterHotKey(Form1.Handle, vk_space, 0, ord(vk_space));
// in ondestroy -> UnRegisterHotKey(Form1.Handle, ord(vk_space));

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 user profile iconTino: 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!)