在Windows控制台中按键

use*_*687 2 c++ windows winapi

我在网上找到了这段代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

使用它像:

while(1) {
    TCHAR key = getch();
}
Run Code Online (Sandbox Code Playgroud)

我能够获得数字,字母甚至返回按键.但我无法逃脱或其他功能键如控制,alt.是否可以修改它以检测这些键?

lak*_*web 7

如果像控制和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;
    }
}
Run Code Online (Sandbox Code Playgroud)

ReadConsoleInput函数

INPUT_RECORD结构

KEY_EVENT_RECORD结构

虚拟密钥代码