Want more features on Pastebin? Sign Up, it's FREE!
Guest

Input

By: a guest on Mar 14th, 2014  |  syntax: C++  |  size: 3.76 KB  |  views: 113  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <Windows.h>
  2. #include <stdio.h>
  3.  
  4. struct Record
  5. {
  6.         unsigned int Event, Key;
  7.  
  8.         long long int Time, Delta;
  9. };
  10.  
  11. Record Records[1000];
  12.  
  13. unsigned int Count = 1;
  14.  
  15. long long int Time;
  16.  
  17. bool Keys[255];
  18.  
  19. LARGE_INTEGER GetFrequency()
  20. {
  21.         LARGE_INTEGER frequency;
  22.  
  23.         QueryPerformanceFrequency(&frequency);
  24.  
  25.         return frequency;
  26. }
  27.  
  28. long long int GetTime()
  29. {
  30.         static LARGE_INTEGER frequency = GetFrequency();
  31.  
  32.         LARGE_INTEGER counter;
  33.  
  34.         QueryPerformanceCounter(&counter);
  35.  
  36.         return (1000000 * counter.QuadPart / frequency.QuadPart);
  37. }
  38.  
  39. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  40. {
  41.         switch (uMsg)
  42.         {
  43.                 /*
  44.                 case WM_KEYDOWN:
  45.  
  46.                         if ((lParam & (1 << 30)) == 0)
  47.                         {
  48.                                 Records[Count].Event = 1;
  49.                                 Records[Count].Key = wParam;
  50.                                 Records[Count].Time = GetTime();
  51.                                 Records[Count].Delta = Records[Count].Time - Time;
  52.  
  53.                                 Time = Records[Count].Time;
  54.  
  55.                                 Count++;
  56.                         }
  57.  
  58.                         break;
  59.  
  60.                 case WM_KEYUP:
  61.  
  62.                         Records[Count].Event = 0;
  63.                         Records[Count].Key = wParam;
  64.                         Records[Count].Time = GetTime();
  65.                         Records[Count].Delta = Records[Count].Time - Time;
  66.  
  67.                         Time = Records[Count].Time;
  68.  
  69.                         Count++;
  70.  
  71.                         break;
  72.                 */
  73.  
  74.                 case WM_INPUT:
  75.                 {
  76.                         unsigned int size;
  77.  
  78.                         GetRawInputData((HRAWINPUT) lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER));
  79.  
  80.                         unsigned char *data = new unsigned char[size];
  81.  
  82.                         GetRawInputData((HRAWINPUT) lParam, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER));
  83.  
  84.                         RAWINPUT *raw = (RAWINPUT*) data;
  85.  
  86.                         if (raw->header.dwType == RIM_TYPEKEYBOARD)
  87.                         {
  88.                                 if (raw->data.keyboard.Flags & RI_KEY_BREAK)
  89.                                 {
  90.                                         if (Keys[raw->data.keyboard.MakeCode])
  91.                                         {
  92.                                                 Keys[raw->data.keyboard.MakeCode] = false;
  93.                                                
  94.                                                 Records[Count].Event = 0;
  95.                                                 Records[Count].Key = raw->data.keyboard.MakeCode;
  96.                                                 Records[Count].Time = GetTime();
  97.                                                 Records[Count].Delta = Records[Count].Time - Time;
  98.  
  99.                                                 Time = Records[Count].Time;
  100.  
  101.                                                 Count++;
  102.                                         }
  103.                                 }
  104.                                 else
  105.                                 {
  106.                                         if (!Keys[raw->data.keyboard.MakeCode])
  107.                                         {
  108.                                                 Keys[raw->data.keyboard.MakeCode] = true;
  109.  
  110.                                                 Records[Count].Event = 1;
  111.                                                 Records[Count].Key = raw->data.keyboard.MakeCode;
  112.                                                 Records[Count].Time = GetTime();
  113.                                                 Records[Count].Delta = Records[Count].Time - Time;
  114.  
  115.                                                 Time = Records[Count].Time;
  116.  
  117.                                                 Count++;
  118.                                         }
  119.                                 }
  120.                         }
  121.  
  122.                         break;
  123.                 }
  124.  
  125.                 case WM_CLOSE:
  126.                
  127.                         PostQuitMessage(EXIT_SUCCESS);
  128.  
  129.                         return 0;
  130.         }
  131.  
  132.         return DefWindowProc(hwnd, uMsg, wParam, lParam);
  133. }
  134.  
  135. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  136. {
  137.         AllocConsole();
  138.  
  139.         freopen("CONIN$", "r", stdin);
  140.         freopen("CONOUT$", "w", stdout);
  141.         freopen("CONOUT$", "w", stderr);
  142.  
  143.         TCHAR className[] = TEXT("Window");
  144.  
  145.         WNDCLASS windowClass = {0};
  146.  
  147.         windowClass.lpfnWndProc = WindowProc;
  148.         windowClass.hInstance = hInstance;
  149.         windowClass.lpszClassName = className;
  150.  
  151.         RegisterClass(&windowClass);
  152.  
  153.         HWND handle = CreateWindow(className, TEXT("Input"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, 0, hInstance, 0);
  154.  
  155.         RAWINPUTDEVICE rid[1] = {0};
  156.  
  157.         rid[0].usUsagePage = 0x01;
  158.         rid[0].usUsage = 0x06;
  159.         rid[0].dwFlags = RIDEV_NOLEGACY;
  160.  
  161.         RegisterRawInputDevices(rid, 1, sizeof(rid[0]));
  162.  
  163.         ShowWindow(handle, nCmdShow);
  164.  
  165.         MSG message;
  166.  
  167.         while (GetMessage(&message, 0, 0, 0))
  168.                 DispatchMessage(&message);
  169.  
  170.         DestroyWindow(handle);
  171.  
  172.         UnregisterClass(className, hInstance);
  173.  
  174.         for (unsigned int i = 1; i < Count; i++)
  175.                 printf("%s %d %lld %lld %s\n", Records[i].Event ? "press  " : "release", Records[i].Key, Records[i].Time, Records[i].Delta,
  176.                 ((Records[i].Delta > 16000) && (Records[i].Event == Records[i - 1].Event)) ? "!" : "");
  177.  
  178.         getchar();
  179.  
  180.         FreeConsole();
  181.  
  182.         return message.wParam;
  183. }
clone this paste RAW Paste Data