首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetAsyncKeyState“奇怪”行为

GetAsyncKeyState“奇怪”行为
EN

Stack Overflow用户
提问于 2016-02-06 18:28:22
回答 1查看 2.2K关注 0票数 2

我有两个简单的表单,Form1和Form2 (Delphi7)。Form1打开Form2,然后在那里等待一个特定的键组合(Ctrl + F2)。一旦我关闭Form2并返回到Form1,我需要检查是否按下了Ctrl键。下面是一个示例:

FORM2

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 19:45:43

你的测试错了。来自文档

如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来按下键,以及键当前是向上还是向下。如果设置了最重要的位,则键被关闭,如果设置了最小的位,则在上一次调用GetAsyncKeyState之后按下键。

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

代码语言:javascript
运行
复制
if GetAsyncKeyState(VK_Control) < 0 then

我还建议您应该调用GetKeyState,以便在按下按钮时获得状态,而不是在处理消息时获得GetAsyncKeyState状态。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35244767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档