GetAsyncKeyState"奇怪"行为

时间:2016-02-06 18:28:23

标签: delphi winapi

我有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。

拜托,你知道发生了什么(以及如何解决)?

1 个答案:

答案 0 :(得分:6)

你的测试是错误的。来自documentation

  

如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在上次调用GetAsyncKeyState之后按下该键。

要测试关键是否已关闭,请查看正在设置的最高位。也就是说,如果该值为负数:

if GetAsyncKeyState(VK_Control) < 0 then

我还建议您应该调用GetKeyState来获取按下按钮时的状态,而不是GetAsyncKeyState,这是处理消息后的状态。