Управление устройствами ввода через Windows API и DirectX. (комментарии)
Это сообщение сгенерировано автоматически.
почему у тебя в клаве GetDeviceState
а в маусе GetDeviceData
тогда клава небуферр.. и ты провафлишь сообщения кнопок не?
сколько можно мертвый трупик DInput'а дергать?
Странно... статья ж 10-ти летней давности
какая разница какой она давности
раз спросил значит акутально
тогданадо удалять статьи с этого сайта по прошествии года - раз запрещено на них отвечать
не трушная статья.
здесь достаточно нужной информации (дальше по ссылками потыкаешь):
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418864(v=vs.85).aspx#retrieving_mouse_movement_data
Overall, using DirectInput offers no advantages when reading data from mouse or keyboard devices, and the use of DirectInput in these scenarios is discouraged.
Overall, the best method to receive high-definition mouse movement data is WM_INPUT. If your users are just moving a mouse pointer, then consider using WM_MOUSEMOVE to avoid needing to perform pointer ballistics. Both of these window messages will work well even if the mouse isn't a high-definition mouse. By supporting high definition, Windows games can offer more precise control to users.
для клавы удобный вариант: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx (как в директинпуте, но без директинпута)
ок спсп
трабла в том что при фпс <30 когда я двигаю мышью безперерывно то величина на окторую двигаю всегда в ходе движения >0
если фпс >200
то в ходе движения мышью он мне возвращает величину движения = 0
то есть прерывается... поэтому у меня баги в моблюре например
причем буфферизация не помогает сделать это непрерывным
if( pMouseDevice ) { succeed=false; do { hr = pMouseDevice->GetDeviceState(sizeof(DIMOUSESTATE), &MouseState); if(FAILED( hr )){ hr = pMouseDevice->Acquire(); if(FAILED( hr )){ pMouseDevice->Unacquire(); pMouseDevice->Release(); pMouseDevice=NULL; if(!InitMouse(hWnd)) Import.error->CriticalError(0,UNKNOWN_ERROR, "Критическая ошибка DirectInput"); pMouseDevice->Acquire(); } } else succeed=true; }while(!succeed); // DIDEVICEOBJECTDATA Data; DWORD Range; int m=0; int mDone=0; int MaxNum=128; while(m<MaxNum) { Range=1; //кол-во сообщений которые хотим взять. //Значение измениться на кол-во сообщений которые могут дать. //Возмем сообщения pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), &Data, &Range, 0); if(!Range)break; //Если сообщений больше нет, выйдем из цикла //Надо помнить, что может прийти не одно сообщение о перемещении //например, по x, т.к. порт //опрашивается 200 в сек, у хороших мышек. switch (Data.dwOfs) { case DIMOFS_X://Курсор сместился по x MouseState.lX = 1; // для теста 1 - пофиг m++; break; case DIMOFS_Y://Курсор сместился по y m++; break; } } }
if(input->GetValue(ID_MOUSE, MV_XAXIS)==0)
ga.Printf(1,123,123,1,"0");
видимо дх инпут не годится для сверхбыстрых опросов..придется юзать OSapi
я хз
Mr F
для клавы удобный вариант: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx (как в директинпуте, но без директинпута)
А возможен случай, когда за время просчета кадра клавишу успели нажать и отпустить, но после просчета кадра при использовании функции GetKeyboardState теряется нажатие?
И вообще имеет ли смысл копировать все 256, или просто в цикле перебрать парочку сообщений которые пришли за время расчетов?
koshmar
> А возможен случай, когда за время просчета кадра клавишу успели нажать и
> отпустить, но после просчета кадра при использовании функции GetKeyboardState
> теряется нажатие?
не понял. вообще по идее юзаем это точно так же, как и опрос клавы в динпуте
---
а, понял. ну вроде бы не было такого. хотя возможно я не очень долго тестил. перелезал с динпута не очень давно.
koshmar
> И вообще имеет ли смысл копировать все 256, или просто в цикле перебрать
> парочку сообщений которые пришли за время расчетов?
вот насчёт этого не знаю точно - копируется ли заранее готовый буфер из системы, или случается оверхед, как с опроса целых 255 клавиш. хотелось бы верить в первое) уж очень удобно, что эту функцию везде юзать можно, а не набивать цикл обработки сообщений винды разной фигней.
а мне значит отказаться от динпута?
и замутить WM_INPUT
The Andreyp
Извиняюсь, не сразу понял систему... думал это автор вспомнил о комментариях...
ок
Тема в архиве.