Delphi FormKeyDown ALT Key Stuck

时间:2012-08-30 18:32:46

标签: delphi winapi delphi-7 vcl keylogger

我有一个包含2个CheckBoxes的表单(1用于保存 CTRL - 1用于保存 ALT )。 两个CheckBox都被禁用,因此表单的KeyDown Event可以正常工作。 如果按下 ALT / CTRL 键,还会有一个TTimer每10ms同步一次。

我的timer

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 CheckBox1.Checked := ALTDOWN;  // ALTDOWN IS GLOBAL
 CheckBox2.Checked := CTRLDOWN; // CTRLDOWN IS GLOBAL
end;

我的KeyDown Event

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_MENU then begin
  ALTDOWN := TRUE;
  exit;
 end;
 if Key = VK_CONTROL then begin
  CTRLDOWN := TRUE;
  exit;
 end;
end;

我的KeyUP Event

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_MENU then begin
  ALTDOWN := FALSE;
  exit;
 end;
 if Key = VK_CONTROL then begin
  CTRLDOWN := FALSE;
  exit;
 end;
end;

这对 CTRL 键没有任何问题。 但是 ALT 键有时会卡住或根本不会出现。 当我按下 ALT 键(没有任何其他键组合)时会发生这种情况。

为什么会这样,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您要以这种方式运行计时器,那么您也可以拨打GetAsyncKeyState

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 CheckBox1.Checked := GetAsyncKeyState(VK_MENU)<0;
 CheckBox2.Checked := GetAsyncKeyState(VK_CONTROL)<0;
end;

然后摆脱你的OnKeyDownOnKeyUp事件处理程序。在系统已经执行此操作时,您尝试跟踪密钥是启动还是停止是没有意义的。

您的计时器间隔很短。无论如何,系统不会经常发射它们。如果我没记错的话,定时器分辨率通常在50ms左右。

答案 1 :(得分:1)

当您想要了解其内部方式时,请阅读microsoft文档(而KeyUp就是这样) http://msdn.microsoft.com/en-us/library/windows/desktop/ms646281.aspx

您可以看到释放Alt键是系统事件,在WM_KeyUp中不会出现。 添加对WM_SYSCOMMAND,WM_SYSKEYUP和WM_SYSKEYDOWN的监视。