1 bool initInput(HWND hWnd) 2 { 3 // 第一步 得到获取设备的接口 和 创建D3D设备一样 4 // 由接口获得另一个接口。 5 HRESULT res; 6 res = DirectInput8Create(GetModuleHandle(NULL), 7 DIRECTINPUT_VERSION, 8 IID_IDirectInput8, 9 (void **)&pInput,10 NULL);11 12 if (!SUCCEEDED(res))13 {14 return false;15 }16 // 第二步 创建设备,鼠标,键盘等。 17 res = pInput->CreateDevice(18 GUID_SysKeyboard, // 设备的GUID,这里使用定义好的19 &pKeyboard, // 设备指针20 NULL);21 if (!SUCCEEDED(res))22 {23 return false;24 }25 // 第三步 为设备设置通信格式26 // 依然使用定义好的27 res = pKeyboard->SetDataFormat(&c_dfDIKeyboard);28 if (!SUCCEEDED(res))29 {30 return false;31 }32 // 第四步 设置协作模式,独占,共享,后台能否交互等。33 // 一般为 前台交互,非独占的模式。34 // 调试状态下 改为 非独占 后台可交互35 res = pKeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);36 //res = pKeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);37 38 if (!SUCCEEDED(res))39 {40 return false;41 }42 43 // 第五步 设置设备的缓冲区大小,默认为0(立即模式),键盘一般为立即模式,鼠标为缓冲模式44 //45 DIPROPDWORD dpw;46 dpw.diph.dwSize = sizeof(DIPROPDWORD); //必须初始化为外围结构的大小,如sizeof(DIPROPDWORD) 47 dpw.diph.dwHeaderSize = sizeof(DIPROPHEADER); //必须初始化为sizeof(DIPROPHEADER) 48 dpw.diph.dwHow = DIPH_DEVICE; //如果包含整个设备则为DIPH_DEVICE,否则为DIPH_BYOFFSET或DIPH_BYID,说明采用哪种系统标识设备物 49 dpw.diph.dwObj = 0; //属性被访问的设备物的标识,如果包含整个设备则为O(对设定缓冲区大小而言) 50 dpw.dwData = 0;51 52 // 外围的大小减去DIPROPHEADER即diph的大小,就可以:得到dwData53 res = pKeyboard->SetProperty(DIPROP_BUFFERSIZE,&dpw.diph);54 if (!SUCCEEDED(res))55 {56 return false;57 }58 res = pKeyboard->Acquire();59 if (!SUCCEEDED(res))60 {61 return false;62 }63 64 return true;65 }
1 bool ReadState(char *buf,DWORD len) 2 { 3 HRESULT res; 4 5 if (NULL == pKeyboard) 6 { 7 return false; 8 } 9 // 由于可能丢失设备10 while (true)11 {12 pKeyboard->Poll();13 res = pKeyboard->GetDeviceState(len,buf);14 if (DIERR_INPUTLOST == res)15 {16 res = pKeyboard->Acquire();17 18 if (FAILED(res))19 {20 break;21 }22 }23 else24 {25 break;26 }27 }28 }
1 BYTE keys[256]; // 256个按键2 #define KEY_DOWN(key) (keys[key] &0x80)