Когда я регистрирую 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()");
}
}
Ваш цикл сообщений должен обрабатывать все сообщения в очереди перед обновлением приложения.
Похоже, вы выскакиваете первое сообщение, переключающееся на ваше приложение. заполнение очереди сообщений, получение одного сообщения, заполнение очереди еще немного … вы получаете точку
Других решений пока нет …