J'ai une application C++ (MFC) qui a besoin de vérifier l'état des touches sur un minuteur. Si l'utilisateur maintient une touche enfoncée, nous retardons le traitement de certains codes.
Voici la vérification pour la touche enfoncée:
if (!GetKeyboardState(keyState))
{
s_executeDeferredResult = e_executeDeferredButtonCheckFailed;
return;
}
s_executeDeferredStuckKeys.clear();
for (int index=0; index
``
Mais, il y a des combinaisons de touches qui restent bloquées:
- Allumez NUMLOCK
- Appuyez sur SHIFT
- Appuyez sur NumPad8
- Relâchez SHIFT
- Relâchez NumPad8
(c'est un exemple, il y en a d'autres, y compris une difficile avec CTRL-ALT-DEL)
GetKeyboardState
va maintenant signaler que VK_UP
est pressé.
Les événements qui se produisent sont (correspondant aux actions ci-dessus).
WM_KEYDOWN
,VK_SHIFT
WM_KEYUP
,VK_SHIFT
WM_KEYDOWN
,VK_UP
WM_KEYDOWN
,VK_SHIFT
WM_KEYUP
,VK_SHIFT
WM_KEYUP
,VK_NUMPAD8
Donc, Windows ne reconnaît pas que la touche Haut est relevée, et maintenant GetKeyboardState
est cassé.
Y a-t-il un bon moyen de vérifier l'état réel de la touche? GetAsyncKeyState
et GetKeyState
rapportent également que la touche est enfoncée.
``