我在网上find了这段代码 :
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(); }
我能够获得数字,字母,甚至返回按键。 但是,我无法获得逃脱或其他function键像控制,替代。 是否可以修改它来检测这些键?
如果像控制和替代键的东西,这些是虚拟按键,它们是字符的补充。 您将需要使用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结构
虚拟键码
你有很多方法来获得键盘输入
您可以使用GetAsyncKeyState https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646293(v=vs.85).aspx或GetKeyState https://msdn.microsoft.com/fr-fr/库/窗/桌面/ ms646301.aspx
这比getch好得多