DirectInput获取键盘状态有两种方式:立即模式和缓冲模式.
其中立即模式可能存在连击捕获:即当你当下左方向键(DIK_LEFT),用GetDeviceState()获得键盘状态,再和0x80求与时,会捕获两次,因此要通过一个中间销此连击捕获状态,具体如下:
char buffer[256];
LPDIRECTINPUTDEVICE7 pDKB ;
void GetKeyState()
{
pDKB->GetDeviceState(sizeof(buffer),(LPVOID)&buffer) ;
int news ;
if (buffer[DIK_LEFT] & 0x80)
{
news = 1 ;
}
else if (buffer[DIK_RIGHT] & 0x80)
{
news = 2 ;
}
else if (buffer[DIK_DOWN] & 0x80)
{
news = 3 ;
}
else if (buffer[DIK_ESCAPE] & 0x80)
{
news = 4 ;
::PostQuitMessage(0) ;
}
else news = 0 ;
if (news == new4ing)
{
if (new4ing)
{
new4 = 0 ;
}
else
{
new4 = news ;
new4ing = news ;
}
}
else
{
new4 = news ;
new4ing = news ;
}
}
在此函数之外再对相应的new4进行处理,即可避免连击捕获.否则
if (buffer[DIK_LEFT] & 0x80)
{
//在此处理,会导致连击捕获
}