Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: vincent en 17 de Febrero de 2005, 05:59:44 PM

Título: Problemas Con Directinput
Publicado por: vincent en 17 de Febrero de 2005, 05:59:44 PM
 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
Título: Problemas Con Directinput
Publicado por: BeRSeRKeR en 17 de Febrero de 2005, 06:40:34 PM
 ¿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.
Título: Problemas Con Directinput
Publicado por: vincent en 17 de Febrero de 2005, 06:40:46 PM
 El caso es que si lo pongo NONEXCLUSIVE y BACKGROUND si que me funciona... pero yo lo quiero en EXCLUSIVE y FOREGROUND...  :(  
Título: Problemas Con Directinput
Publicado por: vincent en 17 de Febrero de 2005, 06:41:26 PM
 Miraré lo de la ventana.

Merci!

VinCenT.
Título: Problemas Con Directinput
Publicado por: BeRSeRKeR en 17 de Febrero de 2005, 06:42:25 PM
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.
Título: Problemas Con Directinput
Publicado por: senior wapo en 17 de Febrero de 2005, 07:00:32 PM
 ...y ya puestos, realmente merece la pena usar directinput para teclado y ratón (teniendo los mensajes de la ventana igualmente)... ?

Título: Problemas Con Directinput
Publicado por: _Grey en 17 de Febrero de 2005, 07:08:54 PM
 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.
Título: Problemas Con Directinput
Publicado por: zupervaca en 17 de Febrero de 2005, 08:20:34 PM
 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