#include "InputSystem.h" #include "log/NLog.h" namespace LifeCore { InputSystem::InputSystem() { auto hInst = GetModuleHandle(NULL); hwnd = NULL; WNDCLASSEX wndClass = { NULL }; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.cbClsExtra = NULL; wndClass.cbWndExtra = NULL; wndClass.hbrBackground = (HBRUSH)GetStockObject(1); wndClass.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW); wndClass.hIcon = LoadIcon(hInst, IDI_APPLICATION); wndClass.hIconSm = LoadIcon(hInst, IDI_APPLICATION); wndClass.hInstance = hInst; wndClass.lpfnWndProc = WndProc; wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndClass.lpszMenuName = NULL; wndClass.lpszClassName = _text("LifeEngineInputWindow"); if(!RegisterClassEx(&wndClass)) { MessageBox((HWND)hwnd, _text("Can not create window class! We all gonna die!!"), _text("OH SHIT!"), MB_OK); } RECT NewWindowSize; NewWindowSize.top = 30; NewWindowSize.left = 300; NewWindowSize.bottom = NewWindowSize.top + 100; NewWindowSize.right = NewWindowSize.left + 100; AdjustWindowRect(&NewWindowSize, WS_OVERLAPPEDWINDOW, false); if(!(hwnd = (long)CreateWindowEx(NULL, _text("LifeEngineInputWindow"), _text("LifeEngine Input window"), WS_THICKFRAME, NewWindowSize.left, NewWindowSize.top, NewWindowSize.right - NewWindowSize.left, NewWindowSize.bottom - NewWindowSize.top, NULL, NULL, hInst, NULL))) { MessageBox((HWND)hwnd, _text("Can not create window! We all gonna die!!"), _text("HOLY SHIT!"), MB_OK); } SetWindowLongPtr((HWND)hwnd, GWLP_USERDATA, (long)(this)); ShowWindow((HWND)hwnd, SW_HIDE); } void InputSystem::Init() { RAWINPUTDEVICE dev; dev.usUsagePage = 1; dev.usUsage = 2; dev.dwFlags = 0; dev.hwndTarget = (HWND)hwnd; if(!RegisterRawInputDevices(&dev, 1, sizeof(dev))) { LogInfo() << "Raw devices registration failed!"; } else { LogInfo() << "Raw devices registered!"; } } void InputSystem::Update() { MSG msg = { 0 }; while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT __stdcall InputSystem::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(message) { case WM_INPUT: { UINT dwSize; GetRawInputData((HRAWINPUT)lparam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); char* data = new char[dwSize]; if(GetRawInputData((HRAWINPUT)lparam, RID_INPUT, data, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) { LogInfo() << "Wrong raw input size!"; } RAWINPUT* inp = (RAWINPUT*)data; if(inp->header.dwType == RIM_TYPEMOUSE) { LogInfo() << "Read mouse input2!"; LogInfo() << "Buttons: " << inp->data.mouse.ulButtons; } long val = GetWindowLongPtr(hwnd, GWLP_USERDATA); if(val) { InputSystem* input = reinterpret_cast(val); LogInfo() << "OnInput"; //wnd->OnInput(); } delete[] data; return 0; } break; } return DefWindowProc(hwnd, message, wparam, lparam); } }