初始化 键盘设备

 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)

 

posted @ 2013-10-14 19:00  lc_cnblog  阅读(782)  评论(0编辑  收藏  举报