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
¿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.
El caso es que si lo pongo NONEXCLUSIVE y BACKGROUND si que me funciona... pero yo lo quiero en EXCLUSIVE y FOREGROUND... :(
Miraré lo de la ventana.
Merci!
VinCenT.
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.
...y ya puestos, realmente merece la pena usar directinput para teclado y ratón (teniendo los mensajes de la ventana igualmente)... ?
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.
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