2

我有一个带有 2 个复选框的表格(1 个用于持有CTRL- 1 个用于持有ALT)。两个 CheckBoxes 都被禁用,因此KeyDown Event表单的正常工作。如果按下/键,还有一个TTimer每 10 毫秒同步一次。ALTCTRL

我的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键(没有任何其他组合键)时会发生这种情况。

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

4

2 回答 2

3

如果您打算以这种方式运行计时器,那么您不妨致电GetAsyncKeyState

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

只需摆脱您的OnKeyDownOnKeyUp事件处理程序。当系统已经这样做时,您尝试跟踪密钥是向上还是向下真的没有意义。

您的计时器间隔很短。无论如何,系统不会那么频繁地触发它们。如果我没记错的话,定时器的分辨率通常在 50 毫秒左右。

于 2012-08-30T18:37:36.557 回答
1

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

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

于 2012-08-31T07:32:48.927 回答