Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi OnKeyDown - Taste Halten verhindern (https://www.delphipraxis.net/137939-onkeydown-taste-halten-verhindern.html)

olee 31. Jul 2009 13:24


OnKeyDown - Taste Halten verhindern
 
Hi ich hab ein kleines Problem:

Ich will im OnKeyDown einen DblKlick von Tasten abfragen.

Mein Problem ist jetzt, dass OnKeyDown beim haten einer Taste nach ner Weile mehrfach
hintereinander ausgelöst wird
(Also wie im Texteditor wenn man z.B. A hält kommt erst eins und nach ner Weile viele As)

Hat einer ne Idee, wie ich das verhindern kann?

Delphi-Quellcode:
[OnKeyDown]
begin
  If (LastKey = Key) and (LastKeyDownTime + 500 > GetTickCount) then
  begin
    DblPressedKey := Key;
    exit;
  end;
  LastKeyDownTime := GetTickCount;
  LastKey        := Key;
end;
MFG

jfheins 31. Jul 2009 13:28

Re: OnKeyDown - Taste Halten verhindern
 
Gehts vll. besser mit dem OnKeyPress?

olee 31. Jul 2009 13:32

Re: OnKeyDown - Taste Halten verhindern
 
Ne denke nicht, da OnKeyPress doch bei manchen Tasten nicht ausgelöst wird ... ich meine bei VK_UP usw.

DeddyH 31. Jul 2009 13:37

Re: OnKeyDown - Taste Halten verhindern
 
Evtl. kannst Du Einfluss auf den repeatcount nehmen (nur so ein spontaner Gedanke)?

olee 31. Jul 2009 13:40

Re: OnKeyDown - Taste Halten verhindern
 
Ha ich hab eine simple Lösung gefunden :lol:

Delphi-Quellcode:
procedure TLOZGameEngine.OnKeyDown(var Key: Word; Shift: TShiftState);
begin
  If LockKey = Key then exit;
  LockKey := Key;
  If (LastKey = Key) and (LastKeyDownTime + 500 > GetTickCount) then
  begin
    DblPressedKey := Key;
    exit;
  end;
  LastKeyDownTime := GetTickCount;
  LastKey        := Key;
end;

procedure TLOZGameEngine.OnKeyUp(var Key: Word; Shift: TShiftState);
begin
  LockKey := 0;
end;
Trotzdem DANKE für eure Hilfe :thumb:

MFG

Custom 31. Jul 2009 13:44

Re: OnKeyDown - Taste Halten verhindern
 
Also was du auch machen könntest ist in deine (sofern du eine hast aber davon geh' ich aus) IdleHandler-Prozedur einen Code Schnipsel einzufügen der ähnlich aussieht aber per GetAsyncKeyState die Tasten abfragt. Zusätzlich brauchst du eben eine Liste mit den Tasten, die in frage kommen - auf die Weise ersparst du dir Rückgaben, die unnütz sind.

Delphi-Quellcode:
function GetDoubleInput: TKey//weiß grad nicht wie die variable für Tasten Bei dem verfahren heißt ^^ 
var
  i: integer;
begin
Result := nil;
  for i := Low(Keys) to High(Keys) do
  if GetAsyncKeyState(Keys[i])<0 then
  begin
    If (LastKey = Keys[i]) and (LastKeyDownTime + 500 > GetTickCount) then
    begin
      Result := Keys[i];
      exit;
    end;
    LastKeyDownTime := GetTickCount;
    LastKey        := Keys[i];
  end;
end;
mfg Custom


Edit: PS:
Zitat:

Zitat von DeddyH
Evtl. kannst Du Einfluss auf den repeatcount nehmen (nur so ein spontaner Gedanke)?

das würde glaube ich nicht gehen, da das ja vom OS festgelegt (bzw im OS "abgespeichert") ist.

Medium 31. Jul 2009 13:48

Re: OnKeyDown - Taste Halten verhindern
 
Ich lese "GameEngine". Wenn du dort evtl. ohnehin schon DirectX einsetzt, wäre evtl. DirectInput auch ein guter Weg. Ist in der Handhabung GetAsyncKeystate() recht ähnlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz