Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

557 lines
19 KiB

  1. /*++
  2. *
  3. * Component: hidserv.dll
  4. * File: hidaudio.h
  5. * Purpose: main application header
  6. *
  7. * Copyright (C) Microsoft Corporation 1997,1998. All rights reserved.
  8. *
  9. * WGJ
  10. --*/
  11. #ifndef _HIDSERV_H_
  12. #define _HIDSERV_H_
  13. ////
  14. /// Defines
  15. //
  16. #define STRICT
  17. #ifndef GLOBALS
  18. #define GLOBALS extern
  19. #define EQU ; / ## /
  20. #else
  21. #define EQU =
  22. #endif //GLOBALS
  23. #define HIDSERV_USAGE_PAGE 0x0c
  24. // default step size is 4% of max volume.
  25. #define DEFAULT_STEP ((int)(65535/25))
  26. #define MAX_BUTTON_LIST 10
  27. // APP messages
  28. #define WM_HIDSERV_START (WM_APP+301)
  29. #define WM_HIDSERV_STOP (WM_APP+302)
  30. #define WM_HIDSERV_REPORT_DISPATCH (WM_APP+304)
  31. #define WM_HIDSERV_SERVICE_REQUEST (WM_APP+305)
  32. #define WM_HIDSERV_INPUT_CLIENT (WM_APP+306)
  33. #define WM_HIDSERV_MEDIAFOCUS_CLIENT (WM_APP+307)
  34. #define WM_HIDSERV_SETMEDIAFOCUS (WM_APP+308)
  35. #define WM_HIDSERV_MEDIAFOCUS_NOTIFY (WM_APP+309)
  36. #define WM_HIDSERV_PNP_HID (WM_APP+310)
  37. #if WIN95_BUILD
  38. #define WM_HIDSERV_STOP_DEVICE (WM_APP+311)
  39. #endif // WIN95_BUILD
  40. #define WM_CUSTOM_USAGE (WM_APP+313)
  41. // CInput Messages
  42. //
  43. #define WM_CI_USAGE (WM_APP+314)
  44. #define WM_CI_MEDIA_FOCUS (WM_APP+315)
  45. #define WM_CI_DEVICE_CHANGE (WM_APP+316)
  46. #define TIMERID_BASE 3
  47. #define TIMERID_TOP 22
  48. #define TIMERID_VOLUMEUP 3
  49. #define TIMERID_VOLUMEDN 4
  50. #define TIMERID_BASSUP 5
  51. #define TIMERID_BASSDN 6
  52. #define TIMERID_TREBLEUP 7
  53. #define TIMERID_TREBLEDN 8
  54. #define TIMERID_APPBACK 9
  55. #define TIMERID_APPFORWARD 10
  56. #define TIMERID_PREVTRACK 11
  57. #define TIMERID_NEXTTRACK 12
  58. #define TIMERID_VOLUMEUP_VK 13
  59. #define TIMERID_VOLUMEDN_VK 14
  60. #define TIMERID_KEYPAD_LPAREN 15
  61. #define TIMERID_KEYPAD_RPAREN 16
  62. #define TIMERID_KEYPAD_AT 17
  63. #define TIMERID_KEYPAD_EQUAL 18
  64. #define TIMERID_CHANNELUP 19
  65. #define TIMERID_CHANNELDOWN 20
  66. #define TIMERID_FF 21
  67. #define TIMERID_RW 22
  68. #define MAX_MEDIA_TYPES 33
  69. #define MAX_CLIENTS 16
  70. #define MAX_USAGE_LIST 32
  71. #define MAX_PENDING_BUTTONS 16
  72. #define MakeLongUsage(c,u) ((ULONG)(c<<16) | (u))
  73. #define SET_SERVICE_STATE(Status) if(hService){ ServiceStatus.dwCurrentState = Status; \
  74. SetServiceStatus(hService, &ServiceStatus);}
  75. ////
  76. /// Includes
  77. //
  78. #include <windows.h>
  79. #include <windowsx.h>
  80. #include <winuser.h>
  81. #include <shellapi.h>
  82. #include <mmsystem.h>
  83. #include <math.h>
  84. #include <basetyps.h>
  85. #include <wtypes.h>
  86. #include <setupapi.h>
  87. #include <hidsdi.h>
  88. #include <dbt.h>
  89. #include <regstr.h>
  90. #include <stdlib.h>
  91. #ifdef __cplusplus
  92. extern "C" {
  93. #endif /* __cplusplus */
  94. // Local includes
  95. #include "hid.h"
  96. #include "list.h"
  97. #include "dbg.h"
  98. //
  99. // Calculate the address of the base of the structure given its type, and an
  100. // address of a field within the structure.
  101. //
  102. #define ContainingRecord(address, type, field) ((type *)( \
  103. (PCHAR)(address) - \
  104. (PCHAR)(&((type *)0)->field)))
  105. // Data Types
  106. //
  107. typedef unsigned long CI_CLIENT_ID;
  108. typedef UINT_PTR OOC_STATE;
  109. typedef struct _Pending_Button{
  110. USAGE Collection;
  111. USAGE Page;
  112. USAGE Usage;
  113. } PENDING_BUTTON, *PPENDING_BUTTON;
  114. typedef LONG (WINAPI *WINSTATIONSENDWINDOWMESSAGE)
  115. (HANDLE hServer,
  116. ULONG sessionID,
  117. ULONG timeOut,
  118. ULONG hWnd,
  119. ULONG Msg,
  120. WPARAM wParam,
  121. LPARAM lParam,
  122. LONG *pResponse);
  123. ////
  124. /// Globals
  125. //
  126. // Linked list of current hid devices
  127. GLOBALS LIST_NODE HidDeviceList;
  128. GLOBALS BOOL PnpEnabled EQU FALSE;
  129. GLOBALS HDEVNOTIFY hNotifyArrival EQU 0;
  130. // This timeout (150ms) is selected to allow the control to cover the range
  131. // (25 steps) in about 5 sec..
  132. GLOBALS UINT INITIAL_WAIT EQU 500;
  133. GLOBALS UINT REPEAT_INTERVAL EQU 150;
  134. // The instance and hwnd for the main thread.
  135. GLOBALS HANDLE hInstance EQU 0;
  136. GLOBALS HWND hWndHidServ EQU 0;
  137. // how many threads are active?
  138. GLOBALS ULONG cThreadRef EQU 0;
  139. // Access to OOC state data is mutex protected.
  140. GLOBALS OOC_STATE OOC_State[TIMERID_TOP-TIMERID_BASE+1];
  141. GLOBALS HANDLE hMutexOOC EQU 0;
  142. GLOBALS PENDING_BUTTON PendingButtonList[MAX_PENDING_BUTTONS];
  143. // NT Service data
  144. GLOBALS SERVICE_STATUS_HANDLE hService EQU 0;
  145. GLOBALS TCHAR HidservServiceName[] EQU TEXT("HidServ");
  146. GLOBALS SERVICE_STATUS ServiceStatus;
  147. // The event signalling that there is input to send.
  148. GLOBALS HANDLE hInputEvent;
  149. GLOBALS HANDLE hDesktopSwitch;
  150. GLOBALS HANDLE hInputDoneEvent;
  151. GLOBALS BOOLEAN InputIsAppCommand;
  152. GLOBALS BOOLEAN InputIsChar;
  153. GLOBALS UCHAR InputVKey;
  154. GLOBALS SHORT InputDown;
  155. GLOBALS USHORT InputAppCommand;
  156. GLOBALS BOOL InputThreadEnabled;
  157. GLOBALS DWORD InputThreadId;
  158. GLOBALS DWORD MessagePumpThreadId;
  159. GLOBALS ULONG InputSessionId;
  160. GLOBALS BOOLEAN InputSessionLocked;
  161. GLOBALS HINSTANCE WinStaDll;
  162. GLOBALS WINSTATIONSENDWINDOWMESSAGE WinStaProc;
  163. /*
  164. WinStationSendWindowMessage(
  165. SERVERNAME_CURRENT, // global server handle
  166. InputSessionId, // session id
  167. 5, // wait in seconds
  168. NULL, // handle of destination window
  169. Down ? WM_KEYDOWN : WM_KEYUP,
  170. Vkey, // wParam
  171. 1, // lParam - input is char
  172. NULL); // No response
  173. */
  174. #define CrossSessionWindowMessage(m, w, l) \
  175. if (WinStaProc) { LONG response; \
  176. WinStaProc (NULL, InputSessionId, 5, HandleToUlong(hWndHidServ), (m), (w), (l), &response); }
  177. #define OOC(_x_) OOC_State[_x_ - TIMERID_BASE]
  178. ////
  179. /// Prototypes
  180. //
  181. //hidaudio.c
  182. DWORD
  183. WINAPI
  184. HidServMain(
  185. HANDLE InitDoneEvent
  186. );
  187. DWORD
  188. WINAPI
  189. ThreadMain(
  190. HWND hwnd,
  191. HINSTANCE hInst,
  192. LPSTR szCmd,
  193. int nShow
  194. );
  195. BOOL
  196. HidServInit(
  197. void
  198. );
  199. void
  200. HidServExit(
  201. void
  202. );
  203. DWORD
  204. WINAPI
  205. HidThreadProc(
  206. PHID_DEVICE HidDevice
  207. );
  208. DWORD
  209. WINAPI
  210. HidThreadInputProc(
  211. PVOID Ignore
  212. );
  213. DWORD
  214. WINAPI
  215. HidMessagePump(
  216. PVOID Ignore
  217. );
  218. VOID
  219. HidFreeDevice(PHID_DEVICE HidDevice);
  220. BOOL
  221. UsageInList(
  222. PUSAGE_AND_PAGE pUsage,
  223. PUSAGE_AND_PAGE pUsageList
  224. );
  225. void
  226. CustomUsageDispatch(
  227. USAGE Collection,
  228. USAGE Usage,
  229. LONG Data
  230. );
  231. void
  232. HidServReportDispatch(
  233. PHID_DEVICE HidDevice
  234. );
  235. VOID
  236. VolumeTimerHandler(
  237. WPARAM TimerID
  238. );
  239. void
  240. HidServUpdate(
  241. DWORD LongUsage,
  242. DWORD Value
  243. );
  244. BOOL
  245. DeviceChangeHandler(
  246. WPARAM wParam,
  247. LPARAM lParam
  248. );
  249. LRESULT CALLBACK HidServProc(
  250. HWND hwnd,
  251. UINT msg,
  252. WPARAM wparam,
  253. LPARAM lparam
  254. );
  255. //
  256. // Media Types
  257. #define CInput_MediaType_None (0x00000000) // actually ALL media types, but with low priority
  258. #define CInput_MediaType_Software (0x00000001) // Virtual, or software devices (player does not use a hrdware medium)
  259. #define CInput_MediaType_System (0x00000002) // The "system" device, Windows itself is a media type
  260. #define CInput_MediaType_CD (0x00000004)
  261. #define CInput_MediaType_DVD (0x00000008)
  262. #define CInput_MediaType_TV (0x00000010)
  263. #define CInput_MediaType_WWW (0x00000020)
  264. #define CInput_MediaType_Telephone (0x00000040)
  265. #define CInput_MediaType_ProgramGuide (0x00000080)
  266. #define CInput_MediaType_VideoPhone (0x00000100)
  267. #define CInput_MediaType_Games (0x00000200)
  268. #define CInput_MediaType_Messages (0x00000400)
  269. #define CInput_MediaType_VCR (0x00000800)
  270. #define CInput_MediaType_Tuner (0x00001000)
  271. #define CInput_MediaType_Tape (0x00002000)
  272. #define CInput_MediaType_Cable (0x00004000)
  273. #define CInput_MediaType_Satellite (0x00008000)
  274. #define CInput_MediaType_Security (0x00010000)
  275. #define CInput_MediaType_Home (0x00020000)
  276. #define CInput_MediaType_Call (0x00040000)
  277. #define CInput_MediaType_Speakers (0x00080000)
  278. #define CInput_MediaType_All (0xffffffff)
  279. #define CInputUsage_NULL ((USAGE) 0x0000)
  280. #define CInputUsage_RANGE ((USAGE) 0xFFFF)
  281. //
  282. // Collections
  283. #define CInputCollection_Consumer_Control ((USAGE) 0x0001)
  284. #define CInputCollection_Numeric_Key_Pad ((USAGE) 0x0002)
  285. #define CInputCollection_Function_Buttons ((USAGE) 0x0036)
  286. #define CInputCollection_Selection ((USAGE) 0x0080)
  287. #define CInputCollection_Media_Selection ((USAGE) 0x0087)
  288. #define CInputCollection_Select_Disc ((USAGE) 0x00BA)
  289. #define CInputCollection_Playback_Speed ((USAGE) 0x00F1)
  290. //
  291. // Media Selection
  292. #define CInput_Media_Select_Computer ((USAGE) 0x0088)
  293. #define CInput_Media_Select_TV ((USAGE) 0x0089)
  294. #define CInput_Media_Select_WWW ((USAGE) 0x008A)
  295. #define CInput_Media_Select_DVD ((USAGE) 0x008B)
  296. #define CInput_Media_Select_Telephone ((USAGE) 0x008C)
  297. #define CInput_Media_Select_Program_Guide ((USAGE) 0x008D)
  298. #define CInput_Media_Select_Video_Phone ((USAGE) 0x008E)
  299. #define CInput_Media_Select_Games ((USAGE) 0x008F)
  300. #define CInput_Media_Select_Messages ((USAGE) 0x0090)
  301. #define CInput_Media_Select_CD ((USAGE) 0x0091)
  302. #define CInput_Media_Select_VCR ((USAGE) 0x0092)
  303. #define CInput_Media_Select_Tuner ((USAGE) 0x0093)
  304. #define CInput_Media_Select_Tape ((USAGE) 0x0096)
  305. #define CInput_Media_Select_Cable ((USAGE) 0x0097)
  306. #define CInput_Media_Select_Satellite ((USAGE) 0x0098)
  307. #define CInput_Media_Select_Security ((USAGE) 0x0099)
  308. #define CInput_Media_Select_Home ((USAGE) 0x009A)
  309. #define CInput_Media_Select_Call ((USAGE) 0x009B)
  310. ////////////////////////////////////
  311. // General Usages
  312. //
  313. #define CInputUsage_Plus_10 ((USAGE) 0x0020)
  314. #define CInputUsage_Plus_100 ((USAGE) 0x0021)
  315. #define CInputUsage_AM_PM ((USAGE) 0x0022)
  316. // device control
  317. #define CInputUsage_Power ((USAGE) 0x0030)
  318. #define CInputUsage_Reset ((USAGE) 0x0031)
  319. #define CInputUsage_Sleep ((USAGE) 0x0032)
  320. #define CInputUsage_Sleep_After ((USAGE) 0x0033)
  321. #define CInputUsage_Sleep_Mode ((USAGE) 0x0034)
  322. #define CInputUsage_Illumination ((USAGE) 0x0035)
  323. // menu
  324. #define CInputUsage_Menu ((USAGE) 0x0040)
  325. #define CInputUsage_Menu_Pick ((USAGE) 0x0041)
  326. #define CInputUsage_Menu_Up ((USAGE) 0x0042)
  327. #define CInputUsage_Menu_Down ((USAGE) 0x0043)
  328. #define CInputUsage_Menu_Left ((USAGE) 0x0044)
  329. #define CInputUsage_Menu_Right ((USAGE) 0x0045)
  330. #define CInputUsage_Menu_Escape ((USAGE) 0x0046)
  331. #define CInputUsage_Menu_Value_Increase ((USAGE) 0x0047)
  332. #define CInputUsage_Menu_Value_Decrease ((USAGE) 0x0048)
  333. // video display
  334. #define CInputUsage_Data_On_Screen ((USAGE) 0x0060)
  335. #define CInputUsage_Closed_Caption ((USAGE) 0x0061)
  336. #define CInputUsage_Closed_Caption_Select ((USAGE) 0x0062)
  337. #define CInputUsage_VCR_TV ((USAGE) 0x0063)
  338. #define CInputUsage_Broadcast_Mode ((USAGE) 0x0064)
  339. #define CInputUsage_Snapshot ((USAGE) 0x0065)
  340. #define CInputUsage_Still ((USAGE) 0x0066)
  341. // broadcast/cable
  342. #define CInputUsage_Assign_Selection ((USAGE) 0x0081)
  343. #define CInputUsage_Mode_Step ((USAGE) 0x0082)
  344. #define CInputUsage_Recall_Last ((USAGE) 0x0083)
  345. #define CInputUsage_Enter_Channel ((USAGE) 0x0084)
  346. #define CInputUsage_Order_Movie ((USAGE) 0x0085)
  347. #define CInputUsage_Channel ((USAGE) 0x0086)
  348. // app control
  349. #define CInputUsage_Quit ((USAGE) 0x0094)
  350. #define CInputUsage_Help ((USAGE) 0x0095)
  351. // channel
  352. #define CInputUsage_Channel_Increment ((USAGE) 0x009C)
  353. #define CInputUsage_Channel_Decrement ((USAGE) 0x009D)
  354. // vcr control
  355. #define CInputUsage_VCR_Plus ((USAGE) 0x00A0)
  356. #define CInputUsage_Once ((USAGE) 0x00A1)
  357. #define CInputUsage_Daily ((USAGE) 0x00A2)
  358. #define CInputUsage_Weekly ((USAGE) 0x00A3)
  359. #define CInputUsage_Monthly ((USAGE) 0x00A4)
  360. // transport control
  361. #define CInputUsage_Play ((USAGE) 0x00B0)
  362. #define CInputUsage_Pause ((USAGE) 0x00B1)
  363. #define CInputUsage_Record ((USAGE) 0x00B2)
  364. #define CInputUsage_Fast_Forward ((USAGE) 0x00B3)
  365. #define CInputUsage_Rewind ((USAGE) 0x00B4)
  366. #define CInputUsage_Scan_Next_Track ((USAGE) 0x00B5)
  367. #define CInputUsage_Scan_Previous_Track ((USAGE) 0x00B6)
  368. #define CInputUsage_Stop ((USAGE) 0x00B7)
  369. #define CInputUsage_Eject ((USAGE) 0x00B8)
  370. #define CInputUsage_Random_Play ((USAGE) 0x00B9)
  371. // advanced transport control
  372. #define CInputUsage_Enter_Disc ((USAGE) 0x00BB)
  373. #define CInputUsage_Repeat ((USAGE) 0x00BC)
  374. #define CInputUsage_Tracking ((USAGE) 0x00BD)
  375. #define CInputUsage_Track_Normal ((USAGE) 0x00BE)
  376. #define CInputUsage_Slow_Tracking ((USAGE) 0x00BF)
  377. #define CInputUsage_Frame_Forward ((USAGE) 0x00C0)
  378. #define CInputUsage_Frame_Back ((USAGE) 0x00C1)
  379. #define CInputUsage_Mark ((USAGE) 0x00C2)
  380. #define CInputUsage_Clear_Mark ((USAGE) 0x00C3)
  381. #define CInputUsage_Repeat_From_Mark ((USAGE) 0x00C4)
  382. #define CInputUsage_Return_To_Mark ((USAGE) 0x00C5)
  383. #define CInputUsage_Search_Mark_Forward ((USAGE) 0x00C6)
  384. #define CInputUsage_Search_Mark_Backwards ((USAGE) 0x00C7)
  385. #define CInputUsage_Counter_Reset ((USAGE) 0x00C8)
  386. #define CInputUsage_Show_Counter ((USAGE) 0x00C9)
  387. #define CInputUsage_Tracking_Increment ((USAGE) 0x00CA)
  388. #define CInputUsage_Tracking_Decrement ((USAGE) 0x00CB)
  389. #define CInputUsage_Stop_Eject ((USAGE) 0x00CC)
  390. #define CInputUsage_Play_Pause ((USAGE) 0x00CD)
  391. #define CInputUsage_Play_Skip ((USAGE) 0x00CE)
  392. // audio
  393. #define CInputUsage_Volume ((USAGE) 0x00E0)
  394. #define CInputUsage_Balance ((USAGE) 0x00E1)
  395. #define CInputUsage_Mute ((USAGE) 0x00E2)
  396. #define CInputUsage_Bass ((USAGE) 0x00E3)
  397. #define CInputUsage_Treble ((USAGE) 0x00E4)
  398. #define CInputUsage_Bass_Boost ((USAGE) 0x00E5)
  399. #define CInputUsage_Surround_Mode ((USAGE) 0x00E6)
  400. #define CInputUsage_Loudness ((USAGE) 0x00E7)
  401. #define CInputUsage_MPX ((USAGE) 0x00E8)
  402. #define CInputUsage_Volume_Increment ((USAGE) 0x00E9)
  403. #define CInputUsage_Volume_Decrement ((USAGE) 0x00EA)
  404. // advanced vcr control
  405. #define CInputUsage_Speed_Select ((USAGE) 0x00F0)
  406. #define CInputUsage_Standard_Play ((USAGE) 0x00F2)
  407. #define CInputUsage_Long_Play ((USAGE) 0x00F3)
  408. #define CInputUsage_Extended_Play ((USAGE) 0x00F4)
  409. #define CInputUsage_Slow ((USAGE) 0x00F5)
  410. // advanced device control
  411. #define CInputUsage_Fan_Enable ((USAGE) 0x0100)
  412. #define CInputUsage_Fan_Speed ((USAGE) 0x0101)
  413. #define CInputUsage_Light_Enable ((USAGE) 0x0102)
  414. #define CInputUsage_Illumination_Level ((USAGE) 0x0103)
  415. #define CInputUsage_Climate_Control_Enable ((USAGE) 0x0104)
  416. #define CInputUsage_Room_Temperature ((USAGE) 0x0105)
  417. #define CInputUsage_Security_Enable ((USAGE) 0x0106)
  418. #define CInputUsage_Fire_Alarm ((USAGE) 0x0107)
  419. #define CInputUsage_Police_Alarm ((USAGE) 0x0108)
  420. // suppl. audio
  421. #define CInputUsage_Balance_Right ((USAGE) 0x0150)
  422. #define CInputUsage_Balance_Left ((USAGE) 0x0151)
  423. #define CInputUsage_Bass_Increment ((USAGE) 0x0152)
  424. #define CInputUsage_Bass_Decrement ((USAGE) 0x0153)
  425. #define CInputUsage_Treble_Increment ((USAGE) 0x0154)
  426. #define CInputUsage_Treble_Decrement ((USAGE) 0x0155)
  427. #define CInputUsage_MS_Bass_Up ((USAGE) 0x0169)
  428. #define CInputUsage_MS_Bass_Down ((USAGE) 0x0169)
  429. #define CInputUsage_MS_Bass_Page ((USAGE) 0xff00)
  430. // App Launch
  431. #define CInputUsage_Launch_Configuration ((USAGE) 0x0183)
  432. #define CInputUsage_Launch_Email ((USAGE) 0x018A)
  433. #define CInputUsage_Launch_Calculator ((USAGE) 0x0192)
  434. #define CInputUsage_Launch_Browser ((USAGE) 0x0194)
  435. // App Commands
  436. #define CInputUsage_App_Help ((USAGE) 0x0095)
  437. #define CInputUsage_App_Spell_Check ((USAGE) 0x01AB)
  438. #define CInputUsage_App_New ((USAGE) 0x0201)
  439. #define CInputUsage_App_Open ((USAGE) 0x0202)
  440. #define CInputUsage_App_Close ((USAGE) 0x0203)
  441. #define CInputUsage_App_Save ((USAGE) 0x0207)
  442. #define CInputUsage_App_Print ((USAGE) 0x0208)
  443. #define CInputUsage_App_Undo ((USAGE) 0x021A)
  444. #define CInputUsage_App_Copy ((USAGE) 0x021B)
  445. #define CInputUsage_App_Cut ((USAGE) 0x021C)
  446. #define CInputUsage_App_Paste ((USAGE) 0x021D)
  447. #define CInputUsage_App_Find ((USAGE) 0x021F)
  448. #define CInputUsage_App_Search ((USAGE) 0x0221)
  449. #define CInputUsage_App_Home ((USAGE) 0x0223)
  450. #define CInputUsage_App_Back ((USAGE) 0x0224)
  451. #define CInputUsage_App_Forward ((USAGE) 0x0225)
  452. #define CInputUsage_App_Stop ((USAGE) 0x0226)
  453. #define CInputUsage_App_Refresh ((USAGE) 0x0227)
  454. #define CInputUsage_App_Previous ((USAGE) 0x0228)
  455. #define CInputUsage_App_Next ((USAGE) 0x0229)
  456. #define CInputUsage_App_Bookmarks ((USAGE) 0x022A)
  457. #define CInputUsage_App_Redo ((USAGE) 0x0279)
  458. #define CInputUsage_App_Reply_To_Mail ((USAGE) 0x0289)
  459. #define CInputUsage_App_Forward_Mail ((USAGE) 0x028B)
  460. #define CInputUsage_App_Send_Mail ((USAGE) 0x028C)
  461. // Keyboard/Keypad
  462. #define CInputUsage_Keypad_Equals ((USAGE) 0x0067)
  463. #define CInputUsage_Keypad_LParen ((USAGE) 0x00B6)
  464. #define CInputUsage_Keypad_RParen ((USAGE) 0x00B7)
  465. #define CInputUsage_Keypad_At ((USAGE) 0x00CE)
  466. #ifdef __cplusplus
  467. }
  468. #endif /* __cplusplus */
  469. #endif // _HIDSERV_H_