Войти
ПрограммированиеФорумОбщее

Управление устройствами ввода через Windows API и DirectX. (комментарии)

#0
4:06, 24 мар. 2013

Управление устройствами ввода через Windows API и DirectX. (комментарии)

Это сообщение сгенерировано автоматически.

#1
4:06, 24 мар. 2013

почему у тебя в клаве GetDeviceState
а в маусе GetDeviceData

тогда клава небуферр.. и ты провафлишь сообщения кнопок не?

#2
11:52, 24 мар. 2013

сколько можно мертвый трупик DInput'а дергать?

#3
12:30, 24 мар. 2013

Странно... статья ж 10-ти летней давности

#4
15:30, 24 мар. 2013

какая разница какой она давности
раз спросил значит акутально

тогданадо удалять статьи с этого сайта по прошествии года - раз запрещено на них отвечать

#5
15:38, 24 мар. 2013

не трушная статья.

здесь достаточно нужной информации (дальше по ссылками потыкаешь):
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 (как в директинпуте, но без директинпута)

#6
15:54, 24 мар. 2013

ок спсп

трабла в том что при фпс <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
я хз

#7
16:20, 24 мар. 2013
Mr F
для клавы удобный вариант: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx (как в директинпуте, но без директинпута)

А возможен случай, когда за время просчета кадра клавишу успели нажать и отпустить, но после просчета кадра при использовании функции GetKeyboardState теряется нажатие?
И вообще имеет ли смысл копировать все 256, или просто в цикле перебрать парочку сообщений которые пришли за время расчетов?

#8
16:43, 24 мар. 2013

koshmar
> А возможен случай, когда за время просчета кадра клавишу успели нажать и
> отпустить, но после просчета кадра при использовании функции GetKeyboardState
> теряется нажатие?
не понял. вообще по идее юзаем это точно так же, как и опрос клавы в динпуте
---
а, понял. ну вроде бы не было такого. хотя возможно я не очень долго тестил. перелезал с динпута не очень давно.

koshmar
> И вообще имеет ли смысл копировать все 256, или просто в цикле перебрать
> парочку сообщений которые пришли за время расчетов?
вот насчёт этого не знаю точно - копируется ли заранее готовый буфер из системы, или случается оверхед, как с опроса целых 255 клавиш. хотелось бы верить в первое) уж очень удобно, что эту функцию везде юзать можно, а не набивать цикл обработки сообщений винды разной фигней.

#9
16:47, 24 мар. 2013

а мне значит отказаться от динпута?
и замутить WM_INPUT

#10
23:39, 24 мар. 2013

The Andreyp
Извиняюсь, не сразу понял систему... думал это автор вспомнил о комментариях...

#11
11:24, 25 мар. 2013

ок

ПрограммированиеФорумОбщее

Тема в архиве.