键盘的编程
1.访问该键盘消息
a.通过WM_CHAR消息
b.通过WM_KEYDOWN和WM_KEYUP消息
c.通过调用GetAsyncKeyState()
其中a与b这两个消息中所封装的信息类型有所不同。
2按下一个键盘上的键将产生两串数据:扫描码或ASCII码,扫描码可指定键盘上每一个键的单值码,和ASCI码无关,只关心是否按下某个键,而不关心大小写(如a和shift+a的区别),扫描码由WM_KEYDOWN消息来负责.
而ASCII码是cooked data,这个可以看见a和shift+a的区别,用WM_CHAR来传递这个消息
3.注意:如果你想编辑一个文字处理器的话,对字符要求很高,那么就必须使用ASCII代码,但是如果你正在编写一个游戏,F表示开枪,S表示猛刺...那么谁又关心ASCII呢,你只需要知道相应的键是否被按下而已。
4.WM_CHAR消息的编程
a.参数:wparam包含所按下键的ASCII码
lparam包含一个位编码状态矢量,描述其他特定的可能被按下的控制键。具体见MSDN
b.例子: case WM_CHAR:
{
// get the character
char ascii_code = wparam;
unsigned int key_state = lparam;
// get a graphics context
hdc = GetDC(hwnd);
// set the foreground color to green
SetTextColor(hdc, RGB(0,255,0));
// set the background color to black
SetBkColor(hdc, RGB(0,0,0));
// set the transparency mode to OPAQUE
SetBkMode(hdc, OPAQUE);
// print the ascii code and key state
sprintf(buffer,"WM_CHAR: Character = %c ",ascii_code);
TextOut(hdc, 0,0, buffer, strlen(buffer));
sprintf(buffer,"Key State = 0x%x ",key_state);
TextOut(hdc, 0,16, buffer, strlen(buffer));
// release the dc back
ReleaseDC(hwnd, hdc);
} break;
5.WM_KEYDOWN消息的编程
1.参数:wparam包含所按下键的虚拟键代码。
lparam包含一个位解码状态矢量,描述其他可能被按下的专用控制键。具体见MSDN
6.GetAsyncKeystate()函数
函数功能:该函数用于确定函数被调用时,相应按键是处于按下状态,还是处于弹起状态;并且按下此键前否调用过GetAsyncKeystate函数。
函数原型:SHORT GetAyncKeystate(int vKey);
参数:
vKey:定义虚拟键码(若有256个虚拟键码)。欲获得更多信息,参看Virtual_Key Codes。在Windows NT中可以使用左右键区分常量来定义某些键。欲获得更多信息,参看备注部分。
返回值:若函数调用成功,返回值给出了自最后一次调用GetAsyncKeyStat。以来,指定的键是否处于按下状态,并且确定了该键目前是按下或是被弹起。若最高位被置为1,则键被接下:若最低位被置为1,则该键在前次调用GetAsyncKeystate以来处于被接下的状态。若另一进程或线程中的窗口拥有键盘焦点,则返回值为零。
例子: #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
HDC hdc = GetDC(hwnd);
char buffer[80];
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(0,0,0));
SetBkMode(hdc,OPAQUE);
sprintf(buffer,"Up Arrow = %d",KEYDOWN(VK_UP));
TextOut(hdc,0,0,buffer,strlen(buffer));