4、day04利用XInput,在CC++创建的窗口中读取键盘输入

    技术2023-06-23  95

    对于GamePad游戏手柄的键盘读入:

    首先,#include<XInput.h>文件,里面存放了很多的控制器,控制着一些键盘,鼠标之类东西的状态。

    因此,为了读取键盘输入,必须先把每个XInput中的控制器遍历一次,包括键盘控制器,鼠标控制器,声音等等;每遍历一次,就获取控制器的状态,如果状态是可以的,就可以输入; 代码逻辑如下:

    DWORD dwResult; for (DWORD i=0; i< XUSER_MAX_COUNT; i++ ) { XINPUT_STATE state; ZeroMemory( &state, sizeof(XINPUT_STATE) ); // Simply get the state of the controller from XInput. dwResult = XInputGetState( i, &state ); if( dwResult == ERROR_SUCCESS ) { // Controller is connected } else { // Controller is not connected } }

    在XInput.h 头文件中,只是定义了与之相关的函数的头部,能保证过编译,但是在运行时却需要动态的dll库函数本体。 但本次我不会去添加dll到项目文件中,而是在代码中自己加入dll库函数,不用在Windows执行程序时去加载这个dll。

    Windows 自带的VirtualKey则是:

    lParam 告诉某个键落下的额外信息,比如,某个键是否在消息送过来之前就落下了。有32个bits,其中每个bit都有特殊的意义:

    30 The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up. 31 The transition state. The value is always 0 for a WM_KEYDOWN message

    0~31 共32 个bit, 第30个比特位表示上一个键的状态,为1 则表示 这个键(上一个键)松开了,并发出一个松开按键的消息; 第31个比特位表示当前的键状态,他只有一个状态,为0即是接收到了一个按键的消息,即认定你按下了某个键,Windows收到了某个键的消息。 图中IsDown是31位比特的返回消息,只有当接收到按键消息时就打印一下某个键按下了; WasDown是30位比特的返回信息,只有按键松开他就会打印某个键是松开了。 运行结果:

    Processed: 0.035, SQL: 9