2016-12-18 3 views
2

Я нашел 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. Можно ли изменить его, чтобы обнаружить также эти ключи?

ответ

4

Если такие вещи, как клавиши управления и альта, это виртуальные нажатия клавиш, они дополняют символы. Вам нужно будет использовать 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

-1

у вас есть много способов, чтобы получить клавиатуры входов

вы можете использовать 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

, которые гораздо лучше, чем Геч

+2

Это для графического интерфейса пользователя заявление с, а не для консольных приложений. Результаты, которые вы собираетесь получить, не синхронизируются с состоянием входного буфера консоли. –

+0

он полностью работает для консольного приложения. Я уже использовал его. – Rifzy

+0

. Вы получите символы, вы не собираетесь синхронизировать их с функциями ввода консоли, Win32 stdin и CRT stdin (и с помощью 'GetAsyncKeyState' вы даже не собираетесь чтобы синхронизировать их с входной очередью потока). Это имеет тонкие последствия, поэтому, если вы не поймете их полностью, вы должны избегать этого. –