как следует из названия...
с моим кодом, который представляет собой обычный пример ввода RAW.... WM_INPUT, RIM_TYPEMOUSE... Я получаю в Windows 10 полную частоту 1000 Гц моей мыши, а в Windows 11 я получаю около 128 Гц.
Как это исправить, чтобы она работала с полными 1000 Гц в Windows 11?
Следует ли мне использовать буферизованное чтение 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 );
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... esnt-get-t