Untitled
#include <stdio.h> #include <windows.h> #define BUF_SIZE 256 #define MAX_SEP 50 LARGE_INTEGER freq, start; double l = -1000, r = -2000; //time of last left or right presses double t() //time in ms { LARGE_INTEGER cur; QueryPerformanceCounter(&cur); double d = (double)(cur.QuadPart - start.QuadPart) / freq.QuadPart; //start = cur; return 1000 * d; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: PostQuitMessage(0); break; case WM_INPUT: { double tt = t(); UINT dwSize; BYTE lpb[BUF_SIZE]; //too lazy to do properly (malloc/free) GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); if (dwSize > BUF_SIZE) { printf("uh oh raw input data too large %d", dwSize); exit(1); } GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)); RAWINPUT* raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { if (raw->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) { l = tt; } if (raw->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) { printf("%f\n", tt - l); fflush(stdout); } /*int pressed = 0; if (raw->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) { l = tt; pressed = 1; } if (raw->data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) { r = tt; pressed = 1; } if (pressed && -MAX_SEP < l - r && l - r < MAX_SEP) { printf("%f\n", l - r); fflush(stdout); }*/ /* printf("id:%X\tx:%d\ty:%d\tbtn:%04X\ttime:%f\n", raw->header.hDevice, raw->data.mouse.lLastX, raw->data.mouse.lLastY, raw->data.mouse.usButtonFlags, t());fflush(stdout); */ } break; } default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MSG msg = {0}; WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = "idkwhattonamethis"; RegisterClass(&wc); HWND hWnd = CreateWindow(wc.lpszClassName, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL); RAWINPUTDEVICE rid; rid.usUsagePage = 0x01; rid.usUsage = 0x02; rid.dwFlags = RIDEV_NOLEGACY | RIDEV_INPUTSINK; rid.hwndTarget = hWnd; RegisterRawInputDevices(&rid, 1, sizeof(rid)); QueryPerformanceFrequency(&freq); //printf("timing precision: %f us", 1e6 / (double)freq.QuadPart); QueryPerformanceCounter(&start); while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); return msg.wParam; }
Leave a Comment