2

我正在寻找一种方法来检测在 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 是否会给我这些信息。如果没有,会怎样?

4

2 回答 2

4

Windows 不会报告某个键被按住的持续时间,只是会针对WM_KEY...被按住的键重复相同的消息。您必须自己手动跟踪持续时间。当您检测到一条WM_KEYDOWN将其wParam位 30 设置为 1 的消息时,如果您尚未跟踪该密钥,请开始跟踪它并存储当前系统/滴答声,否则获取当前系统/滴答声时间,计算持续时间,然后采取行动因此。当您收到一条WM_KEYUP消息时,如果您正在跟踪它,请停止跟踪该密钥。

于 2012-10-19T20:25:40.600 回答
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,以防用户在收到警报后使用键盘以外的其他方法更改框 - 所以他们不会收到两次警报。

于 2012-10-19T17:02:42.637 回答