我有两个简单的表单,Form1和Form2 (Delphi7)。Form1打开Form2,然后在那里等待一个特定的键组合(Ctrl + F2)。一旦我关闭Form2并返回到Form1,我需要检查是否按下了Ctrl键。下面是一个示例:
FORM2
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Shift = [ssCtrl]) and (Key = VK_F2) then
ShowMessage('Ctrl + F2 pressed!');
end;
FORM1
procedure TForm1.btn1Click(Sender: TObject);
begin
Try
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
Finally
Form2.Release;
Form2 := nil;
end;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
if (GetAsyncKeyState(VK_Control) <> 0) then
ShowMessage('Ctrl is pressed!');
end;
问题是,每次我在Form2上按Ctrl + Form2,似乎Ctrl键卡住了,而(GetAsyncKeyState(VK_Control) <> 0)总是返回true。
拜托,你知道发生了什么事(以及如何解决)吗?
发布于 2016-02-06 19:45:43
你的测试错了。来自文档
如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来按下键,以及键当前是向上还是向下。如果设置了最重要的位,则键被关闭,如果设置了最小的位,则在上一次调用GetAsyncKeyState之后按下键。
要测试键是否已关闭,请查看正在设置的最重要的位。也就是说,如果值为负数:
if GetAsyncKeyState(VK_Control) < 0 then
我还建议您应该调用GetKeyState
,以便在按下按钮时获得状态,而不是在处理消息时获得GetAsyncKeyState
状态。
https://stackoverflow.com/questions/35244767
复制相似问题