键盘编程

这篇博客探讨了键盘编程的几个关键方面,包括通过WM_CHAR、WM_KEYDOWN和WM_KEYUP消息以及GetAsyncKeyState()函数来访问键盘消息。内容详细介绍了WM_CHAR和WM_KEYDOWN消息的参数及编程示例,以及GetAsyncKeyState()函数的用途和返回值解释,特别指出在游戏编程中可能更关注于按键是否被按下,而非ASCII码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

键盘的编程
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)); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值