С моим кодом, который представляет собой обычный пример ввода 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 ... windows-10
Низкая производительность API необработанного ввода Windows 11 по сравнению с Windows 10 ⇐ C++
Программы на C++. Форум разработчиков
1763717111
Anonymous
С моим кодом, который представляет собой обычный пример ввода 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 );
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79826321/windows-11-raw-input-api-bad-performance-compared-to-windows-10[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия