RawInput загружает 100% моего первого ядра ЦП и не обновляется должным образом

Когда я регистрирую RawInput, я проверяю все возвраты функций, все в порядке. Однако, когда я обновляю его, он забивает производительность моего 1-го ядра ЦП и не работает должным образом (когда я проверяю, есть ли «M»). кнопка нажата, и она создает окно сообщения, когда оно есть, оно не просто срабатывает, когда я нажимаю ‘M’, но оно срабатывает всякий раз, когда я нажимаю что-либо или перемещаю мышь. Также окно сообщения не появляется, есть только гудок.)
Вот код, который я использую для его инициализации:

    const ushort usageTable[] =
{
InputDeviceUsage::UsageMouse,
InputDeviceUsage::UsageKeyboard,
InputDeviceUsage::UsageGamepad,
};

const ulong flagsTable[] =
{
mouseFlags,
keyboardFlags,
hidFlags
};

const List<SystemDevices>& systemDevices = EnumerateSystemDevices();

List<String> deviceNames;
List<InputDeviceInfo> deviceInfo;

for(uint i = 0; i < systemDevices.Size(); i++)
{
deviceNames.Add(GetDeviceName(systemDevices[i].hDevice));
deviceInfo.Add(GetDeviceInfo(systemDevices[i].hDevice));

InputDevice device =
{
InputDeviceUsagePage::UsagePageHID,
usageTable[deviceInfo[i].dwType],
flagsTable[deviceInfo[i].dwType],
window
};

RegisteredDevices.Add(device);
Devices[systemDevices[i].hDevice] = CreateDevice(deviceInfo[i].dwType);

Где список является эквивалентом станд :: вектор<> и это typedefs и определяет задействованные:

enum InputDeviceUsagePage
{
UsagePageHID = 0x01
};

enum InputDeviceUsage
{
UsageMouse = 0x02,
UsageKeyboard = 0x06,
UsageGamepad = 0x04
};

enum InputDeviceType
{
TypeMouse = RIM_TYPEMOUSE,
TypeKeyboard = RIM_TYPEKEYBOARD,
TypeHID = RIM_TYPEHID
};

enum InputDeviceChangeBehavior
{
Arrival = GIDC_ARRIVAL,
Removal = GIDC_REMOVAL
};

enum InputDeviceDataRequest
{
PreparseData =  RIDI_PREPARSEDDATA,
Name =  RIDI_DEVICENAME,
Info = RIDI_DEVICEINFO
};

И это Обновить функция:

    try
{
InputData data;
RawDevice::UpdateUnbuffered(reinterpret_cast<HRAWINPUT>(lparam), &data);

DevicePtr it = Devices[data.header.hDevice];

if(it == nullptr)
{
DevicePtr newDevice = CreateDevice(data.header.dwType);

Devices.Add(data.header.hDevice, newDevice);

if(data.header.hDevice != null)
{
it = newDevice;
}
}

DevicePtr device = it;

device->Read(data);

switch(data.header.dwType)
{
case InputDeviceType::TypeMouse:
{
const RawMouse& mouse = static_cast<RawMouse&>(*device);

//TODO: add event handling here
break;
}

case InputDeviceType::TypeKeyboard:
{
const RawKeyboard& keyboard = static_cast<RawKeyboard&>(*device);

//TODO: add event handling here
break;
}

case InputDeviceType::TypeHID:
{
const RawHID& hid = static_cast<RawHID&>(*device);

//TODO: add event handling here
break;
}

default:
{

}
}
return(exit_success);
}
catch(...)
{
return(DefWindowProc(window, message, wparam, lparam));
}

Так, например, в местах, которые имеют // TODO: добавить обработку событий здесь Я кладу:

            case InputDeviceType::TypeKeyboard:
{
const RawKeyboard& keyboard = static_cast<RawKeyboard&>(*device);

if(keyboard.KeyDown('M'))
{
MessageBox(window, L"Pressed key is 'M'", L"Input event", MB_OK);
}
break;
}

Я получаю звуковой сигнал каждый раз, когда нажимаю любую кнопку или любую кнопку мыши, не только M, а также окно сообщения не отображается, окно просто подает звуковой сигнал. И ядро ​​ЦП загружается по максимуму. Это KeyDown () функция:

const bool RawKeyboard::KeyDown(ushort key) const
{
if(_data.VKey == key && !(_data.Flags & KeyActions::KeyDown))
{
return(true);
}
{
return(false);
}
}

DevicePtr в основном RawDevice * который содержит имя и Информация об устройстве и из RawDevice наследуется RawMouse, RawKeyboard а также RawHID, которые в них есть RAWMOUSE, RAWKEYBOARD, RAWHID Члены названы _данные.

РЕДАКТИРОВАТЬ: Просто чтобы добавить место, где называется обновление:

            case WM_INPUT:
{
return(_input.Update(_mainWindow.GetHandle(), message, wparam, lparam));
}
break;

EDIT2: Забыли добавить метод ReadUnbuffered:

    void RawDevice::UpdateUnbuffered(const HRAWINPUT rawInput, RAWINPUT* data)
{
wint64 size(sizeof(RAWINPUT));

boolresult = GetRawInputData(rawInput, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER));

if(result == false)
{
throw RawInputException(GetLastError(), L"GetRawInputData()");
}
}

0

Решение

Ваш цикл сообщений должен обрабатывать все сообщения в очереди перед обновлением приложения.

Похоже, вы выскакиваете первое сообщение, переключающееся на ваше приложение. заполнение очереди сообщений, получение одного сообщения, заполнение очереди еще немного … вы получаете точку

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]