控制台编程

一 判断哪个键按下

  1 使用_getch()获取并判断(这个应该也可以判断鼠标按键处理, 不过暂时没有研究明白)

    首先用_kbhit()判断是否有键盘按下事件,如果有再用_getch()获取这个字符并进行判断.不过需要注意以下事项:

    (1)这个返回值是int类型

    (2)字母部分是区分大小写的, 就是说输入大写字母跟输入小写字母, _getch()返回的值是不一样的

    (3)回车是与 VK_RETURN进行比较的, 也就是0x0d

    (4)对于功能键和方向键的读取是需要调用两次_getch()的, 第一次返回0x00或者0xe0, 第二次返回按键的物理键代码(也叫扫描码). 这里需要用到一个MapVirtualKey(), 这个函数的作用是在扫描码与虚拟码之间进行转换, 上面的VK_RETURN就是虚拟码中的一个

     完整的判断代码如下:

#include<windows.h>

#include<conio.h>

int ch =0;

if (_kbhit())
{
  ch= _getch();

  if(ch == VK_RETURN)

    // 回车键按下处理

  else if(ch == 'a')

    // 小写字母处理

  else if(ch == 'A')

    // 大写字母处理

  else if (ch == 0 || ch == 0xe0 )
  {
    ch = _getch();
    ch = MapVirtualKey(ch, MAPVK_VSC_TO_VK);
    if (ch == VK_UP)
      //向上发现键按下处理
  }
}

  2 使用GetAsyncKeyState()函数获取

  参考自: http://blog.csdn.net/feidegengao/article/details/8528911

    if(GetAsyncKeyState(虚拟键值) & 0x8000)

    //键按下的处理事件

   注意: 

    (1) 返回值表示两个内容,一个是最高位bit的值,代表这个键是否被按下,一个是最低位bit的值,代表在上次调用, 因此在判断当前按下时, 要看最高位时候为1

    (2)字母不区分大写, 判断的时候参数一律取大写字母的asc2的值

    (3)功能键, 方向键,鼠标键均可以直接使用虚拟键值作为参数进行判断

    (4)类似函数的区别与联

SHORT GetKeyState(int nVirtKey);  //从windows消息队列中取得键盘消息,返回key status

SHORT GetAsyncKeyState(int vKey);  //直接侦测键盘的硬件中断,返回key status

BOOL GetKeyboardState(PBYTE lpKeyState);//当从windows消息队列中移除键盘消息时,才返回key status

  3 使用控制台 api接收按键输入

    需要使用的相关函数如下:

      SetConsoleMode

      ReadConsoleInput

      GetStdHandle

原文地址:https://www.cnblogs.com/talenth/p/6825880.html