Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con Directinput

Iniciado por vincent, 17 de Febrero de 2005, 05:59:44 PM

« anterior - próximo »

vincent

 Muy buenas,

estoy intentando controlar el mouse de mi motor con DirectInput. Para hacerlo utilizo este código (que es el que pone en todos los tutoriales...)


if(FAILED(m_pDirectInputObject->CreateDevice(GUID_SysMouse,&m_pDirectInputMouseDevice,NULL)))
{
MessageBox(NULL,"CreateDevice() failed!","InitMouse()",MB_OK);
return false;
}

if(FAILED(m_pDirectInputMouseDevice->SetDataFormat(&c_dfDIMouse)))
{
MessageBox(NULL,"SetDataFormat() failed!","InitMouse()",MB_OK);
return false;
}

if(FAILED(m_pDirectInputMouseDevice->SetCooperativeLevel(m_Hwnd,DISCL_FOREGROUND | DISCL_EXCLUSIVE)))
{
MessageBox(NULL,"SetCooperativeLevel() failed!","InitMouse()",MB_OK);
return false;
}


if(FAILED(m_pDirectInputMouseDevice->Acquire()))
{
MessageBox(NULL,"Acquire() failed!","InitMouse()",MB_OK);
return false;
}


Todo va bien hasta la llamada a la función Acquire() que me da error.

Alguien ve qué está mal?

Gracias!

VinCenT
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

BeRSeRKeR

 ¿Está la ventana activa?. Tal vez es que no tiene el foco. Nosotros el Acquire lo hacemos cuando se lanza el evento OnActivated (supongo que el equivalente en el API Win32 es WM_ACTIVATE o tal vez WM_ACTIVATEAPP) y hasta ahora ha ido bien. ¡Si lo haces así, no se te olvide comprobar que el device sea distinto de NULL!. ;)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

vincent

 El caso es que si lo pongo NONEXCLUSIVE y BACKGROUND si que me funciona... pero yo lo quiero en EXCLUSIVE y FOREGROUND...  :(  
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

vincent

 Miraré lo de la ventana.

Merci!

VinCenT.
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

BeRSeRKeR

Cita de: "vincent"El caso es que si lo pongo NONEXCLUSIVE y BACKGROUND si que me funciona... pero yo lo quiero en EXCLUSIVE y FOREGROUND...  :(
Supongo que es lógico, si está en modo no exclusivo se ve que le da igual que la ventana esté o no activa.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

senior wapo

 ...y ya puestos, realmente merece la pena usar directinput para teclado y ratón (teniendo los mensajes de la ventana igualmente)... ?


_Grey

 He hechado un vistazo rapido a algo de codigo antiguo y por lo que e visto.....

El Acquire() retorna un valor de error que te servira para ver que falla, en concreto a mi me da DIERR_OTHERAPPHASPRIO, es es decir que lo tiene otra aplicacion, de hecho si es a pantalla completa me funciona bien.

Si te da DIERR_INVALIDPARAM o DIERR_NOTINITIALIZED es que tienes mal el codigo de antes del Acquire(), si es un DIERR_OTHERAPPHASPRIO es simplemente que otra aplicacion lo tiene y has de recuperarlo en el momento adecuado.

De hecho lo tenia como DISCL_BACKGROUND | DISCL_NONEXCLUSIVE, pero me e puesto a hacer pruebas con DISCL_FOREGROUND | DISCL_EXCLUSIVE, y funciona bien.

Si el error es DIERR_OTHERAPPHASPRIO, ignoralo y continua con la aplicacion normalmente. En el bucle de mensajes tengo el codigo que hace el Acquire()(pon el tuyo donde mejor te parezca), y si lo coge leo el estado del teclado y si no, no.

Comprueba cual es el error. Por cierto todo esto es aplicado al KEYBOARD, pero para el raton no deberia ser diferente.

Suerte.

zupervaca

 siempre que el device se pierda debes de realizar una llamada a esa funcion ademas no siempre podras recuperarlo con lo que tendras que realizar varias llamadas hasta que lo consigas






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.