在 Windows 控制台中获取按键

新手上路,请多包涵

我在网上找到 了这段代码

 CHAR getch() {
    DWORD mode, cc;
    HANDLE h = GetStdHandle( STD_INPUT_HANDLE );

    if (h == NULL) {
        return 0; // console not found
    }

    GetConsoleMode( h, &mode );
    SetConsoleMode( h, mode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT) );
    TCHAR c = 0;
    ReadConsole( h, &c, 1, &cc, NULL );
    SetConsoleMode( h, mode );
    return c;
}

像这样使用它:

 while(1) {
    TCHAR key = getch();
}

我能够获得数字、字母甚至返回按键。但我无法获得转义或其他功能键,如控制、alt。是否可以对其进行修改以检测这些键?

原文由 user1806687 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 616
1 个回答

如果像控制和 alt 键这样的东西,这些是虚拟键击,它们是字符的补充。您将需要使用 ReadConsoleInput 。但你会得到一切,鼠标也一样。所以你真的需要过滤并从调用中返回一个结构,这样你就知道它是否是 ctrl-A Alt-A 之类的。如果您不想要它们,过滤器会重复。

这可能需要工作,不知道你在追求什么……

 bool getconchar( KEY_EVENT_RECORD& krec )
{
    DWORD cc;
    INPUT_RECORD irec;
    HANDLE h = GetStdHandle( STD_INPUT_HANDLE );

    if (h == NULL)
    {
        return false; // console not found
    }

    for( ; ; )
    {
        ReadConsoleInput( h, &irec, 1, &cc );
        if( irec.EventType == KEY_EVENT
            &&  ((KEY_EVENT_RECORD&)irec.Event).bKeyDown
            )//&& ! ((KEY_EVENT_RECORD&)irec.Event).wRepeatCount )
        {
            krec= (KEY_EVENT_RECORD&)irec.Event;
            return true;
        }
    }
    return false; //future ????
}

int main( )
{
    KEY_EVENT_RECORD key;
    for( ; ; )
    {
        getconchar( key );
        std::cout << "key: " << key.uChar.AsciiChar
            << " code:  " << key.wVirtualKeyCode << std::endl;
    }
}

ReadConsoleInput 函数

INPUT_RECORD 结构

KEY_EVENT_RECORD 结构

虚拟键码

原文由 lakeweb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题