我有一个包含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 键(没有任何其他键组合)时会发生这种情况。
为什么会这样,我该如何解决这个问题?
答案 0 :(得分:3)
如果您要以这种方式运行计时器,那么您也可以拨打GetAsyncKeyState
procedure TForm1.Timer1Timer(Sender: TObject);
begin
CheckBox1.Checked := GetAsyncKeyState(VK_MENU)<0;
CheckBox2.Checked := GetAsyncKeyState(VK_CONTROL)<0;
end;
然后摆脱你的OnKeyDown
和OnKeyUp
事件处理程序。在系统已经执行此操作时,您尝试跟踪密钥是启动还是停止是没有意义的。
您的计时器间隔很短。无论如何,系统不会经常发射它们。如果我没记错的话,定时器分辨率通常在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的监视。