• 文章
  • getch() 的替代方案
发布
2010年2月22日 (最后更新: 2010年2月24日)

getch() 的替代方案

评分: 3.4/5 (95 票)
*****
好吧,我看到很多人建议使用非标准的 getch() 或 _getch()。

请不要使用 conio.h 库,因为它不可靠且非标准。MSV C++ 08 中的 conio.h 与 Mingw C 中的有很大不同。
其中许多函数,如 textcolor()、cprintf 等,已被弃用,并且有其他替代方案。

在这里,我将发布一个使用 Win API 的 getch() 替代方案。
哦,它只能在 Windows 上运行……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <windows.h>
CHAR GetCh (VOID)
{
  HANDLE hStdin = GetStdHandle (STD_INPUT_HANDLE);
  INPUT_RECORD irInputRecord;
  DWORD dwEventsRead;
  CHAR cChar;

  while(ReadConsoleInputA (hStdin, &irInputRecord, 1, &dwEventsRead)) /* Read key press */
    if (irInputRecord.EventType == KEY_EVENT
	&&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT
	&&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_MENU
	&&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL)
    {
      cChar = irInputRecord.Event.KeyEvent.uChar.AsciiChar;
	ReadConsoleInputA (hStdin, &irInputRecord , 1, &dwEventsRead); /* Read key release */
	return cChar;
    }
  return EOF;
}

上面的代码应该有效,因为它对我有效。

欢迎提出建议和改进。我是这个领域的菜鸟。