我有2个简单的表单,Form1和Form2(Delphi 7)。 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 + F2时,似乎Ctrl键卡住了,(GetAsyncKeyState(VK_Control)&lt;&gt; 0)总是返回true。
拜托,你知道发生了什么(以及如何解决)?
答案 0 :(得分:6)
你的测试是错误的。来自documentation:
如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在上次调用GetAsyncKeyState之后按下该键。
要测试关键是否已关闭,请查看正在设置的最高位。也就是说,如果该值为负数:
if GetAsyncKeyState(VK_Control) < 0 then
我还建议您应该调用GetKeyState
来获取按下按钮时的状态,而不是GetAsyncKeyState
,这是处理消息后的状态。