一 判断哪个键按下
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