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)