KeyboardDevice.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #ifndef _XBOX
  2. #include "KeyboardDevice.h"
  3. #include "pc.h"
  4. #define DIRECTINPUT_VERSION 0x0800
  5. #include <dinput.h>
  6. #include "..\..\common_h\systemmsg.h"
  7. KeyboardDevice::KeyboardDevice(Controls& ctrlSrv, IDirectInput8A* di, const DIDEVICEINSTANCEA& deviceInst) :
  8. m_Device(NULL),
  9. m_ControlsService(ctrlSrv),
  10. m_Controls(__FILE__, __LINE__)
  11. {
  12. Assert(di);
  13. di->CreateDevice(deviceInst.guidInstance, &m_Device, NULL);
  14. Assert(m_Device);
  15. HWND hWnd = (HWND)api->Storage().GetLong("system.hWnd");
  16. m_Device->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
  17. m_Device->SetDataFormat(&c_dfDIKeyboard);
  18. m_Device->Acquire();
  19. InitControls();
  20. }
  21. KeyboardDevice::~KeyboardDevice()
  22. {
  23. if (m_Device)
  24. {
  25. m_Device->Unacquire();
  26. m_Device->Release(), m_Device = NULL;
  27. }
  28. }
  29. void __declspec(dllexport) KeyboardDevice::InitControls()
  30. {
  31. Control ctrl;
  32. ctrl.value = 0.0f;
  33. ctrl.diCode = DIK_A; ctrl.name = "A"; m_Controls.Add(ctrl);
  34. ctrl.diCode = DIK_B; ctrl.name = "B"; m_Controls.Add(ctrl);
  35. ctrl.diCode = DIK_C; ctrl.name = "C"; m_Controls.Add(ctrl);
  36. ctrl.diCode = DIK_D; ctrl.name = "D"; m_Controls.Add(ctrl);
  37. ctrl.diCode = DIK_E; ctrl.name = "E"; m_Controls.Add(ctrl);
  38. ctrl.diCode = DIK_F; ctrl.name = "F"; m_Controls.Add(ctrl);
  39. ctrl.diCode = DIK_G; ctrl.name = "G"; m_Controls.Add(ctrl);
  40. ctrl.diCode = DIK_H; ctrl.name = "H"; m_Controls.Add(ctrl);
  41. ctrl.diCode = DIK_I; ctrl.name = "I"; m_Controls.Add(ctrl);
  42. ctrl.diCode = DIK_J; ctrl.name = "J"; m_Controls.Add(ctrl);
  43. ctrl.diCode = DIK_K; ctrl.name = "K"; m_Controls.Add(ctrl);
  44. ctrl.diCode = DIK_L; ctrl.name = "L"; m_Controls.Add(ctrl);
  45. ctrl.diCode = DIK_M; ctrl.name = "M"; m_Controls.Add(ctrl);
  46. ctrl.diCode = DIK_N; ctrl.name = "N"; m_Controls.Add(ctrl);
  47. ctrl.diCode = DIK_O; ctrl.name = "O"; m_Controls.Add(ctrl);
  48. ctrl.diCode = DIK_P; ctrl.name = "P"; m_Controls.Add(ctrl);
  49. ctrl.diCode = DIK_Q; ctrl.name = "Q"; m_Controls.Add(ctrl);
  50. ctrl.diCode = DIK_R; ctrl.name = "R"; m_Controls.Add(ctrl);
  51. ctrl.diCode = DIK_S; ctrl.name = "S"; m_Controls.Add(ctrl);
  52. ctrl.diCode = DIK_T; ctrl.name = "T"; m_Controls.Add(ctrl);
  53. ctrl.diCode = DIK_U; ctrl.name = "U"; m_Controls.Add(ctrl);
  54. ctrl.diCode = DIK_V; ctrl.name = "V"; m_Controls.Add(ctrl);
  55. ctrl.diCode = DIK_W; ctrl.name = "W"; m_Controls.Add(ctrl);
  56. ctrl.diCode = DIK_X; ctrl.name = "X"; m_Controls.Add(ctrl);
  57. ctrl.diCode = DIK_Y; ctrl.name = "Y"; m_Controls.Add(ctrl);
  58. ctrl.diCode = DIK_Z; ctrl.name = "Z"; m_Controls.Add(ctrl);
  59. ctrl.diCode = DIK_0; ctrl.name = "0"; m_Controls.Add(ctrl);
  60. ctrl.diCode = DIK_1; ctrl.name = "1"; m_Controls.Add(ctrl);
  61. ctrl.diCode = DIK_2; ctrl.name = "2"; m_Controls.Add(ctrl);
  62. ctrl.diCode = DIK_3; ctrl.name = "3"; m_Controls.Add(ctrl);
  63. ctrl.diCode = DIK_4; ctrl.name = "4"; m_Controls.Add(ctrl);
  64. ctrl.diCode = DIK_5; ctrl.name = "5"; m_Controls.Add(ctrl);
  65. ctrl.diCode = DIK_6; ctrl.name = "6"; m_Controls.Add(ctrl);
  66. ctrl.diCode = DIK_7; ctrl.name = "7"; m_Controls.Add(ctrl);
  67. ctrl.diCode = DIK_8; ctrl.name = "8"; m_Controls.Add(ctrl);
  68. ctrl.diCode = DIK_9; ctrl.name = "9"; m_Controls.Add(ctrl);
  69. ctrl.diCode = DIK_NUMPAD0; ctrl.name = "kb_numpad0"; m_Controls.Add(ctrl);
  70. ctrl.diCode = DIK_NUMPAD1; ctrl.name = "kb_numpad1"; m_Controls.Add(ctrl);
  71. ctrl.diCode = DIK_NUMPAD2; ctrl.name = "kb_numpad2"; m_Controls.Add(ctrl);
  72. ctrl.diCode = DIK_NUMPAD3; ctrl.name = "kb_numpad3"; m_Controls.Add(ctrl);
  73. ctrl.diCode = DIK_NUMPAD4; ctrl.name = "kb_numpad4"; m_Controls.Add(ctrl);
  74. ctrl.diCode = DIK_NUMPAD5; ctrl.name = "kb_numpad5"; m_Controls.Add(ctrl);
  75. ctrl.diCode = DIK_NUMPAD6; ctrl.name = "kb_numpad6"; m_Controls.Add(ctrl);
  76. ctrl.diCode = DIK_NUMPAD7; ctrl.name = "kb_numpad7"; m_Controls.Add(ctrl);
  77. ctrl.diCode = DIK_NUMPAD8; ctrl.name = "kb_numpad8"; m_Controls.Add(ctrl);
  78. ctrl.diCode = DIK_NUMPAD9; ctrl.name = "kb_numpad9"; m_Controls.Add(ctrl);
  79. ctrl.diCode = DIK_F1; ctrl.name = "kb_f1"; m_Controls.Add(ctrl);
  80. ctrl.diCode = DIK_F2; ctrl.name = "kb_f2"; m_Controls.Add(ctrl);
  81. ctrl.diCode = DIK_F3; ctrl.name = "kb_f3"; m_Controls.Add(ctrl);
  82. ctrl.diCode = DIK_F4; ctrl.name = "kb_f4"; m_Controls.Add(ctrl);
  83. ctrl.diCode = DIK_F5; ctrl.name = "kb_f5"; m_Controls.Add(ctrl);
  84. ctrl.diCode = DIK_F6; ctrl.name = "kb_f6"; m_Controls.Add(ctrl);
  85. ctrl.diCode = DIK_F7; ctrl.name = "kb_f7"; m_Controls.Add(ctrl);
  86. ctrl.diCode = DIK_F8; ctrl.name = "kb_f8"; m_Controls.Add(ctrl);
  87. ctrl.diCode = DIK_F9; ctrl.name = "kb_f9"; m_Controls.Add(ctrl);
  88. ctrl.diCode = DIK_F10; ctrl.name = "kb_f10"; m_Controls.Add(ctrl);
  89. ctrl.diCode = DIK_F11; ctrl.name = "kb_f11"; m_Controls.Add(ctrl);
  90. ctrl.diCode = DIK_F12; ctrl.name = "kb_f12"; m_Controls.Add(ctrl);
  91. ctrl.diCode = DIK_F13; ctrl.name = "kb_f13"; m_Controls.Add(ctrl);
  92. ctrl.diCode = DIK_F14; ctrl.name = "kb_f14"; m_Controls.Add(ctrl);
  93. ctrl.diCode = DIK_F15; ctrl.name = "kb_f15"; m_Controls.Add(ctrl);
  94. ctrl.diCode = DIK_UP; ctrl.name = "kb_up"; m_Controls.Add(ctrl);
  95. ctrl.diCode = DIK_DOWN; ctrl.name = "kb_down"; m_Controls.Add(ctrl);
  96. ctrl.diCode = DIK_LEFT; ctrl.name = "kb_left"; m_Controls.Add(ctrl);
  97. ctrl.diCode = DIK_RIGHT; ctrl.name = "kb_right"; m_Controls.Add(ctrl);
  98. ctrl.diCode = DIK_HOME; ctrl.name = "kb_home"; m_Controls.Add(ctrl);
  99. ctrl.diCode = DIK_END; ctrl.name = "kb_end"; m_Controls.Add(ctrl);
  100. ctrl.diCode = DIK_PRIOR; ctrl.name = "kb_prior"; m_Controls.Add(ctrl);
  101. ctrl.diCode = DIK_NEXT; ctrl.name = "kb_next"; m_Controls.Add(ctrl);
  102. ctrl.diCode = DIK_INSERT; ctrl.name = "kb_insert"; m_Controls.Add(ctrl);
  103. ctrl.diCode = DIK_DELETE; ctrl.name = "kb_delete"; m_Controls.Add(ctrl);
  104. ctrl.diCode = DIK_SPACE; ctrl.name = "kb_space"; m_Controls.Add(ctrl);
  105. ctrl.diCode = DIK_RETURN; ctrl.name = "kb_return"; m_Controls.Add(ctrl);
  106. ctrl.diCode = DIK_TAB; ctrl.name = "kb_tab"; m_Controls.Add(ctrl);
  107. ctrl.diCode = DIK_BACKSPACE; ctrl.name = "kb_back"; m_Controls.Add(ctrl);
  108. ctrl.diCode = DIK_ESCAPE; ctrl.name = "kb_escape"; m_Controls.Add(ctrl);
  109. ctrl.diCode = DIK_LCONTROL; ctrl.name = "kb_lcontrol"; m_Controls.Add(ctrl);
  110. ctrl.diCode = DIK_RCONTROL; ctrl.name = "kb_rcontrol"; m_Controls.Add(ctrl);
  111. ctrl.diCode = DIK_LSHIFT; ctrl.name = "kb_lshift"; m_Controls.Add(ctrl);
  112. ctrl.diCode = DIK_RSHIFT; ctrl.name = "kb_rshift"; m_Controls.Add(ctrl);
  113. ctrl.diCode = DIK_LALT; ctrl.name = "kb_lalt"; m_Controls.Add(ctrl);
  114. ctrl.diCode = DIK_RALT; ctrl.name = "kb_ralt"; m_Controls.Add(ctrl);
  115. ctrl.diCode = DIK_LWIN; ctrl.name = "kb_lwin"; m_Controls.Add(ctrl);
  116. ctrl.diCode = DIK_RWIN; ctrl.name = "kb_rwin"; m_Controls.Add(ctrl);
  117. ctrl.diCode = DIK_NUMLOCK; ctrl.name = "kb_numlock"; m_Controls.Add(ctrl);
  118. ctrl.diCode = DIK_CAPSLOCK; ctrl.name = "kb_capital"; m_Controls.Add(ctrl);
  119. ctrl.diCode = DIK_SCROLL; ctrl.name = "kb_scroll"; m_Controls.Add(ctrl);
  120. ctrl.diCode = DIK_PAUSE; ctrl.name = "kb_pause"; m_Controls.Add(ctrl);
  121. // ctrl.diCode = DIK_CAPITAL; ctrl.name = "kb_capital"; m_Controls.Add(ctrl);
  122. ctrl.diCode = DIK_SYSRQ; ctrl.name = "kb_snapshot"; m_Controls.Add(ctrl);
  123. ctrl.diCode = DIK_MULTIPLY; ctrl.name = "kb_multiply"; m_Controls.Add(ctrl);
  124. ctrl.diCode = DIK_DIVIDE; ctrl.name = "kb_divide"; m_Controls.Add(ctrl);
  125. ctrl.diCode = DIK_ADD; ctrl.name = "kb_add"; m_Controls.Add(ctrl);
  126. ctrl.diCode = DIK_SUBTRACT; ctrl.name = "kb_subtract"; m_Controls.Add(ctrl);
  127. ctrl.diCode = DIK_APPS; ctrl.name = "kb_apps"; m_Controls.Add(ctrl);
  128. // ctrl.diCode = DIK_GRAVE; ctrl.name = "kb_grave"; m_Controls.Add(ctrl);
  129. ctrl.diCode = DIK_MINUS; ctrl.name = "kb_minus"; m_Controls.Add(ctrl);
  130. ctrl.diCode = DIK_EQUALS; ctrl.name = "kb_equals"; m_Controls.Add(ctrl);
  131. ctrl.diCode = DIK_BACKSLASH; ctrl.name = "kb_backslash"; m_Controls.Add(ctrl);
  132. ctrl.diCode = DIK_LBRACKET; ctrl.name = "kb_lbracket"; m_Controls.Add(ctrl);
  133. ctrl.diCode = DIK_RBRACKET; ctrl.name = "kb_rbracket"; m_Controls.Add(ctrl);
  134. ctrl.diCode = DIK_SEMICOLON; ctrl.name = "kb_semicolon"; m_Controls.Add(ctrl);
  135. ctrl.diCode = DIK_APOSTROPHE; ctrl.name = "kb_apostrophe"; m_Controls.Add(ctrl);
  136. ctrl.diCode = DIK_COMMA; ctrl.name = "kb_comma"; m_Controls.Add(ctrl);
  137. ctrl.diCode = DIK_PERIOD; ctrl.name = "kb_period"; m_Controls.Add(ctrl);
  138. ctrl.diCode = DIK_SLASH; ctrl.name = "kb_slash"; m_Controls.Add(ctrl);
  139. ctrl.diCode = DIK_DECIMAL; ctrl.name = "kb_decimal"; m_Controls.Add(ctrl);
  140. ctrl.diCode = DIK_NUMPADENTER; ctrl.name = "kb_numpadenter"; m_Controls.Add(ctrl);
  141. }
  142. void KeyboardDevice::Update(float DeltaTime)
  143. {
  144. if( !m_Device )
  145. return;
  146. m_ControlsService.ClearKeyBuffer();
  147. CoreSystemMessage msg;
  148. ControlsMessage* data = null;
  149. for( dword i = 0; i < api->GetSystemMessagesCount() ; i++ )
  150. {
  151. api->GetSystemMessage(i,msg);
  152. if( string::IsEqual(msg.id,CONTROLS_MESSAGE))
  153. {
  154. data = (ControlsMessage*)msg.data;
  155. if (data)
  156. {
  157. if (data->dwMsgID == WM_CHAR)
  158. {
  159. KeyDescr desc;
  160. desc.bSystem = false;
  161. desc.ucVKey = data->wParam;
  162. m_ControlsService.AddKey(desc);
  163. }
  164. if (data->dwMsgID == WM_KEYDOWN)
  165. {
  166. KeyDescr desc;
  167. desc.bSystem = true;
  168. desc.ucVKey = data->wParam;
  169. m_ControlsService.AddKey(desc);
  170. }
  171. }
  172. }
  173. }
  174. unsigned char buffer[256];
  175. HRESULT hr = m_Device->GetDeviceState(sizeof(buffer), buffer);
  176. if ( SUCCEEDED(hr) )
  177. {
  178. for (unsigned int i = 0; i < m_Controls.Size(); ++i)
  179. m_Controls[i].value = (float)(buffer[m_Controls[i].diCode] >> 7);
  180. }
  181. else
  182. {
  183. for (unsigned int i = 0; i < m_Controls.Size(); ++i)
  184. m_Controls[i].value = 0.0f;
  185. }
  186. if ( FAILED(hr) )
  187. m_Device->Acquire();
  188. }
  189. long KeyboardDevice::GetIndex(const char* deviceControl)
  190. {
  191. for (unsigned int i = 0; i < m_Controls.Size(); ++i)
  192. if (deviceControl == m_Controls[i].name)
  193. return i;
  194. return INVALID_CODE;
  195. }
  196. float KeyboardDevice::GetRawValue(long controlIndex) const
  197. {
  198. if ((unsigned long)controlIndex >= m_Controls.Size())
  199. return 0.0f;
  200. return m_Controls[controlIndex].value;
  201. }
  202. #endif