【问题标题】:Get key press in windows console在 Windows 控制台中获取按键
【发布时间】:2016-12-18 20:40:03
【问题描述】:

我在网上找到了this piece of code

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。是否可以对其进行修改以检测这些键?

【问题讨论】:

    标签: c++ windows winapi


    【解决方案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 function

    INPUT_RECORD structure

    KEY_EVENT_RECORD structure

    Virtual-Key Codes

    【讨论】:

      【解决方案2】:

      你有很多方法来获取键盘输入

      您可以使用 GetAsyncKeyState https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646293(v=vs.85).aspx 或 GetKeyState https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646301.aspx

      比getch好很多

      【讨论】:

      • 这些适用于 GUI 应用程序,而不适用于控制台应用程序。您将获得的结果不会与控制台输入缓冲区的状态同步。
      • 你会得到字符,你不会让它们与控制台输入函数同步,Win32 标准输入和 CRT 标准输入(和 GetAsyncKeyState 你甚至不会让它们同步与线程的输入队列)。这有微妙的含义,所以除非你完全理解它们,否则你应该避免这些东西。
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多