Autor Beitrag
Delphi-Noobie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19343
Erhaltene Danke: 1753

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 25.01.05 12:55 
Wie wärs mit Application.ProcessMessages in einer Schleife, die nach dem Schuss z.B. 1000 ms wartet?

ausblenden 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
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
BeitragVerfasst: Di 25.01.05 12:56 
Warum kein Timer? Damit ginge es doch auch:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19343
Erhaltene Danke: 1753

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 25.01.05 13:42 
:oops: Ich seh grad, dass ich genau den umgekehrten Fall verstanden hatte, sorry.
Delphi-Noobie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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:
ausblenden 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.

_________________
Was du heute kannst verschieben, das besorge lieber morgen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 25.01.05 16:23 
Nimm DirectX oder OpenGL, diese Bibliotheken sind auf so was ausgelegt.
Delphi-Noobie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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:

_________________
Was du heute kannst verschieben, das besorge lieber morgen.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
BeitragVerfasst: 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!)