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的大小,就可以:得到dwData 53 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 else 24 { 25 break; 26 } 27 } 28 }
1 BYTE keys[256]; // 256个按键 2 #define KEY_DOWN(key) (keys[key] &0x80)