With my code which is just a regular RAW input example.... WM_INPUT, RIM_TYPEMOUSE... I'm getting on Windows 10 the full 1,000Hz of my mouse and on Windows 11 I'm getting about 128Hz.
How to fix this so it works with full 1,000Hz on Windows 11?
Should I be using buffered read of RawInputData?
static LRESULT CALLBACK HiddenWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
if ( msg == WM_INPUT ) {
UINT dwSize = 0;
GetRawInputData( (HRAWINPUT)lParam, RID_INPUT, nullptr, &dwSize, sizeof( RAWINPUTHEADER ) );
BYTE* lpb = new BYTE[dwSize];
if ( GetRawInputData( (HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof( RAWINPUTHEADER ) ) != dwSize ) {
delete[] lpb;
return DefWindowProc( hwnd, msg, wParam, lParam );
}
RAWINPUT* raw = (RAWINPUT*)lpb;
if ( raw->header.dwType == RIM_TYPEMOUSE ) {
_MouseData md = mousedata.load();
md.dx += raw->data.mouse.lLastX;
md.dy += raw->data.mouse.lLastY;
md.dw += (*(short*)&raw->data.mouse.usButtonData) / WHEEL_DELTA;
md.tick += 1;
mousedata.store( md );
// printf( "X: %i, Y: %i, W: %i\n", raw->data.mouse.lLastX, raw->data.mouse.lLastY, (*(short*)&raw->data.mouse.usButtonData) / WHEEL_DELTA );
}
delete[] lpb;
}
. . .
return DefWindowProc( hwnd, msg, wParam, lParam );
}
static HWND CreateHiddenMessageWindow( HINSTANCE hInst ) {
const wchar_t CLASS_NAME[] = L"HiddenRawInputWindow";
WNDCLASS wc = {};
wc.lpfnWndProc = HiddenWndProc;
wc.hInstance = hInst;
wc.lpszClassName = CLASS_NAME;
RegisterClass( &wc );
// MESSAGE-ONLY window (no visible UI)
HWND hwnd = CreateWindowEx(
0, CLASS_NAME, L"test", 0,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
nullptr, nullptr, hInst, nullptr
);
return hwnd;
}
static int _RegisterRawMouse( HWND hwnd ) {
// Register for all HID input (generic)
RAWINPUTDEVICE rid[1] = {};
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x02;
rid[0].dwFlags = RIDEV_NOLEGACY | RIDEV_CAPTUREMOUSE | RIDEV_INPUTSINK;
rid[0].hwndTarget = hwnd;
if ( not RegisterRawInputDevices( rid, 1, sizeof( RAWINPUTDEVICE ) ) ) {
return 1;
}
return 0;
}
while ( PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}