Advertisement
Guest User

Input2

a guest
Mar 16th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 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.             long long int currentTime = GetTime();
  77.  
  78.             unsigned int size;
  79.  
  80.             GetRawInputData((HRAWINPUT) lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER));
  81.  
  82.             unsigned char *data = new unsigned char[size];
  83.  
  84.             GetRawInputData((HRAWINPUT) lParam, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER));
  85.  
  86.             RAWINPUT *raw = (RAWINPUT*) data;
  87.  
  88.             if (raw->header.dwType == RIM_TYPEKEYBOARD)
  89.             {
  90.                 if (raw->data.keyboard.Flags & RI_KEY_BREAK)
  91.                 {
  92.                     if (Keys[raw->data.keyboard.MakeCode])
  93.                     {
  94.                         Keys[raw->data.keyboard.MakeCode] = false;
  95.                        
  96.                         Records[Count].Event = 0;
  97.                         Records[Count].Key = raw->data.keyboard.MakeCode;
  98.                         Records[Count].Time = currentTime;
  99.                         Records[Count].Delta = Records[Count].Time - Time;
  100.  
  101.                         Time = Records[Count].Time;
  102.  
  103.                         Count++;
  104.                     }
  105.                 }
  106.                 else
  107.                 {
  108.                     if (!Keys[raw->data.keyboard.MakeCode])
  109.                     {
  110.                         Keys[raw->data.keyboard.MakeCode] = true;
  111.  
  112.                         Records[Count].Event = 1;
  113.                         Records[Count].Key = raw->data.keyboard.MakeCode;
  114.                         Records[Count].Time = currentTime;
  115.                         Records[Count].Delta = Records[Count].Time - Time;
  116.  
  117.                         Time = Records[Count].Time;
  118.  
  119.                         Count++;
  120.                     }
  121.                 }
  122.             }
  123.  
  124.             break;
  125.         }
  126.  
  127.         case WM_CLOSE:
  128.        
  129.             PostQuitMessage(EXIT_SUCCESS);
  130.  
  131.             return 0;
  132.     }
  133.  
  134.     return DefWindowProc(hwnd, uMsg, wParam, lParam);
  135. }
  136.  
  137. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  138. {
  139.     AllocConsole();
  140.  
  141.     freopen("CONIN$", "r", stdin);
  142.     freopen("CONOUT$", "w", stdout);
  143.     freopen("CONOUT$", "w", stderr);
  144.  
  145.     TCHAR className[] = TEXT("Window");
  146.  
  147.     WNDCLASS windowClass = {0};
  148.  
  149.     windowClass.lpfnWndProc = WindowProc;
  150.     windowClass.hInstance = hInstance;
  151.     windowClass.lpszClassName = className;
  152.  
  153.     RegisterClass(&windowClass);
  154.  
  155.     HWND handle = CreateWindow(className, TEXT("Input"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, 0, hInstance, 0);
  156.  
  157.     RAWINPUTDEVICE rid[1] = {0};
  158.  
  159.     rid[0].usUsagePage = 0x01;
  160.     rid[0].usUsage = 0x06;
  161.     rid[0].dwFlags = RIDEV_NOLEGACY;
  162.  
  163.     RegisterRawInputDevices(rid, 1, sizeof(rid[0]));
  164.  
  165.     ShowWindow(handle, nCmdShow);
  166.  
  167.     MSG message;
  168.  
  169.     while (GetMessage(&message, 0, 0, 0))
  170.         DispatchMessage(&message);
  171.  
  172.     DestroyWindow(handle);
  173.  
  174.     UnregisterClass(className, hInstance);
  175.  
  176.     for (unsigned int i = 1; i < Count; i++)
  177.         printf("%s %d %lld %lld %s\n", Records[i].Event ? "press  " : "release", Records[i].Key, Records[i].Time, Records[i].Delta,
  178.         ((Records[i].Delta > 16000) && (Records[i].Event == Records[i - 1].Event)) ? "!" : "");
  179.  
  180.     getchar();
  181.  
  182.     FreeConsole();
  183.  
  184.     return message.wParam;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement