C语言中某些键组中断if语句的奇怪行为

C语言中某些键组中断if语句的奇怪行为,c,C,以下用C编写的程序应在按住空格键的同时打印“按下”。但是,只要在按住空格键的同时按下以下任意键:Shift、Ctr、Alt、Esc、Backspace,可能还有其他我没有测试过的键,if语句中的代码就会停止执行,直到释放并重新按下空格键为止,即使空格键仍然保持不变并且GetAsyncKeyState(0x87)的计算结果仍然为-32767(按下)。(当您在保持空间的同时关闭caps lock时也会发生这种情况,但在打开caps lock时则不会发生) #包括 #包括 #pragma注释(lib,

以下用C编写的程序应在按住空格键的同时打印“按下”。但是,只要在按住空格键的同时按下以下任意键:Shift、Ctr、Alt、Esc、Backspace,可能还有其他我没有测试过的键,if语句中的代码就会停止执行,直到释放并重新按下空格键为止,即使空格键仍然保持不变并且GetAsyncKeyState(0x87)的计算结果仍然为-32767(按下)。(当您在保持空间的同时关闭caps lock时也会发生这种情况,但在打开caps lock时则不会发生)

#包括
#包括
#pragma注释(lib,“User32.lib”)
int main()
{
按下int空格键=0;
而(1)
{
睡眠(1000);
按下空格键=(int)GetAsyncKeyState(0x20);
如果(按下空格键==-32767)printf(“按下”);
}
}
当程序测试是否按住F1-F12键并按下另一个F1-F12键时,或者当程序测试是否按住F13-F24键并按下其中一个键时,也会发生这种情况

我很想知道为什么会发生这种情况,因为我看不到程序流程中的任何逻辑缺陷(虽然我是C语言新手),而且我在另一种语言中也没有看到类似的情况。我在网上也看不到这方面的任何信息,但也许我只是找不到正确的地方

提前谢谢


编辑:为了澄清,当我说“GetAsyncKeyState(0x87)仍然计算为-32767(按下)”时,即使它没有打印“按下”,我的意思是spacebar_pressed的值实际上是-32767。我试着打印spacebar_pressed,只要空格键被物理按下,它总是-32767。这意味着它实际上持有正确的值,即使if语句中的表达式的计算结果不是真的。这对我来说是最奇怪的部分。我不能想一个这样的行为可能发生的原因。

您正在检查最低有效位,这正是导致问题的原因

只需检查GetAsyncKeyState()是否返回true,即可解决此问题:

#include <Windows.h>
#include <iostream>

int main()
{
    while (1)
    {
        Sleep(500);
        if (GetAsyncKeyState(VK_SPACE))
        {
            std::cout << "Pressed\n";
        }
    }
}
#包括
#包括
int main()
{
而(1)
{
睡眠(500);
if(GetAsyncKeyState(VK_空间))
{

std::cout似乎中间按下其他键会中断连续的报告,因为之后没有额外按下空格键,它会报告
“在上次调用GetAsyncKeyState后是否按下了该键”
。当没有按下其他键时,它看起来会继续向下报告键,并且没有任何东西可以中断该过程。您必须在文档中进一步挖掘——这只是粗略地看一下。@DavidC.Rankin起初我还以为会发生类似的事情,但我尝试打印空格键打开时保持不变的变量s已按下,但仍注册为已按下(-32767)这将导致if语句表达式的计算结果为true。我将编辑原始问题以使其更清楚。奇怪的是,阅读文档时修改了最低有效位以确定状态,
-32767
的值为
SHORT\u MIN+1
(或者从未签名的角度来看,
USHORT_MAX-1
),因此返回似乎表明发生了什么,并且与文档相对应(尽管我不经常使用windows,因此我必须进一步查看以确认)@谢谢,我刚刚查看了GetAsyncKeyState的返回结果,结果发现我只是误读了输出(不知何故)。它是-32768,而不是-32767,正如你所说。很抱歉浪费了你的时间。再次感谢。咯咯笑…这不会是最后一次了…欢迎编程。。。
#include <Windows.h>
#include <iostream>

int main()
{
    while (1)
    {
        Sleep(500);
        if (GetAsyncKeyState(VK_SPACE))
        {
            std::cout << "Pressed\n";
        }
    }
}