我正在寻找一种方法来检测一个密钥在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是否会给我这些信息。如果没有,会是什么?
答案 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>