Advertisement
Guest User

Input

a guest
Mar 14th, 2014
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.76 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement