Untitled

 avatar
unknown
plain_text
16 days ago
2.6 kB
7
Indexable
#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