【问题标题】:GetAsyncKeyState "strange" behaviorGetAsyncKeyState“奇怪”行为
【发布时间】:2016-05-16 15:32:00
【问题描述】:

我有 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) 0)总是返回true。

请问,您知道发生了什么(以及如何解决)吗?

【问题讨论】:

  • 附带说明,您应该使用Form2 := TForm2.Create(nil) 而不是Application.CreateForm(TForm2, Form2),并使用Form2.Free 而不是Form2.ReleaseCreateForm() 与直接调用 Create() 相比没有任何好处,除非在创建 MainForm 时,而 Release() 用于当 Form 需要在其自己的事件处理程序中释放自身时使用,在这种情况下使用 @ 是不安全的987654330@.

标签: delphi winapi


【解决方案1】:

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

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

要仅测试键是否关闭,请查看设置的最高有效位。也就是说,如果值为负:

if GetAsyncKeyState(VK_Control) < 0 then

我还建议您改为调用GetKeyState,以获取按下按钮时的状态,而不是GetAsyncKeyState,后者是您稍后处理消息时的状态。

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多