Léger problème avec DirectInput
J'ai créé l'objet
DirectInput8Create dans la class de ma fenêtre
j'ai créé une classe clavier pour gérer tout le code DirectInput du clavier dans celle ci
bool Keyboard::Initialize (LPDIRECTINPUT8 di, HWND hWnd)
{ HRESULT hr = di->CreateDevice (GUID_SysKeyboardEm, &keyboard, NULL);
if (FAILED(hr))
{ InitializeError ();
return false;
}
hr = keyboard->SetDataFormat (&c_dfDIKeyboard);
if FAILED(hr)
{ InitializeError();
return false;
}
hr = keyboard->SetCooperativeLevel (hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE );
if FAILED(hr)
{ InitializeError();
return false;
}
hr = keyboard->Acquire ();
if FAILED(hr)
{ InitializeError ();
return false;
}
return true;
}
dans la boucle de message, j'ai un appel à une fonction dans ma classe clavier:
void Keyboard::ProcessInput ()
{#define KEYDOWN(name, key) (name[key] & 0x80)
if (keyboard)
{ char buffer[256];
ZeroMemory (buffer, sizeof(buffer)); // J'ai essayé avec et sans cette ligne
HRESULT hr = keyboard->GetDeviceState (sizeof (buffer),(LPVOID)&buffer);
if FAILED (hr)
{
return;
}
if (KEYDOWN (buffer, DIK_ESCAPE))
PostQuitMessage (0);
if (KEYDOWN(buffer, DIK_RIGHT)) // J'ai ajouté ce if en pensant qu'il y
PostQuitMessage (0); // avait en problème avec ma touche ESC
for (int i= 0; i < 256; i++ ) // J'ai ajouté cette boucle for
{ // Pour tester toutes les touches if( buffer[i] & 0x80 ) // du clavier.
{ PostQuitMessage (0);
}
}
J'ai beau appuyé sur n'importe quelle touche de mon clavier, il n'y a jamais une de mes touches pressées qui fonctionne. Si je met un point d'arrêt sur la fonction dans la boucle de message qui
appelle cette fonction, le programme est arrêté à ce point, donc elle est bien appelée.
Si je met un point d'insertion sur la méthode GetDeviceState méthode, le programme s'arrête à cette
méthode, donc la fonction est réellement bien appelée, mais comme j'entre dans visual C++,
mon programme perd l'acquisition du clavier, et donc je me retrouve dans le code d'erreur de cette
méthode.
J'utilise le DirectX SDK de mars 2008. Quelqu'un connais t'il la réponse à ce problème ?
J'ai du utilisé le niveau de coopération: DISCL_BACKGROUND | DISCL_NONEXCLUSIVE.
C'est le seul qui fonctionne, en mode debug ou release, l'application lancée dans ou en dehors de l'IDE
Visual C++.