如何检测按键被按下的时间长短?

时间:2012-10-19 11:28:14

标签: delphi winapi keyboard delphi-7

我正在寻找一种方法来检测一个密钥在Delphi项目中停留了多长时间并警告用户。

我正在制作一个聊天程序,需要查看此人是否按下了一个字母,如W键,以便将该聊天框写入垃圾邮件。我将举例说明在Delphi 7中尝试做什么:

//Looking up if key in use and held for lets say 20 seconds
if (GetAsyncKeyState(Byte(VkKeyScan('W'))) shl 20) <> 0 then
begin
  ShowMessage('W Key Held down too long!');
end;

我不确定GetAsyncKeyState是否会给我这些信息。如果没有,会是什么?

2 个答案:

答案 0 :(得分:4)

Windows不会报告按键被按下的持续时间,只会针对按下的按键重复相同的WM_KEY...消息。您必须手动跟踪持续时间。当您检测到WM_KEYDOWN位为wParam时设置为1的WM_KEYUP消息时,如果您尚未跟踪该密钥,请开始跟踪并存储当前系统/勾选,否则抓住当前系统/滴答时间,计算持续时间,并采取相应行动。当您收到{{1}}消息时,如果您正在跟踪该消息,请停止跟踪该密钥。

答案 1 :(得分:1)

我使用StopWatch单元中的StopWatch类来检查时间。以下是您尝试使用它的方法:

uses StopWatch;

//in the Form's private declaration:
  StopWatch : TStopWatch;

//in the Form's onCreate:
  StopWatch := TStopWatch.Create(nil);

//in the Form's onDestroy:
  StopWatch.Free();

//in the form/box onKeyDown:
  StopWatch.Start();

//in the form/box onChange:
  if (StopWatch.ElapsedMiliseconds > 1000)
    ShowMessage('W Key Held down too long!');

//in the form/box onKeyUp:
  StopWatch.Stop();
  StopWatch.Start();
  StopWatch.Stop();

虽然有很多其他方法可以完成你想要做的事情。但是为了快速尝试,这应该有用。

我停止并再次启动秒表onKeyUp的原因是清除ElapsedMiliseconds,以防用户在收到警报后用键盘以外的其他方法更改框 - 这样他们就不会收到两次警报。 / p>