Il semble que si vous appelez ToAscii()
ou ToUnicode()
alors que dans un hook WH_KEYBOARD_LL global, et une touche morte est pressée, il sera 'détruit'. Par exemple, supposons que vous avez configuré votre langue d'entrée dans Windows comme étant l'espagnol et que vous voulez taper une lettre accentuée á dans un programme. Normalement, vous devez appuyer sur la touche de guillemets simples (la touche morte), puis sur la lettre "a", puis sur l'écran á sera affiché, comme prévu.ToAscii/ToUnicode dans un crochet de clavier détruit les touches mortes
Mais cela ne fonctionne pas si vous appelez ToAscii()
ou ToUnicode()
dans une fonction de crochet de bas niveau. Il semble que la clé morte est détruite, et donc aucune lettre accentuée á apparaît à l'écran. Supprimer un appel aux fonctions ci-dessus résout le problème ... mais malheureusement, je dois pouvoir appeler ces fonctions.
J'ai fait une recherche Google pendant un certain temps, et même si beaucoup de gens semblaient avoir ce problème, aucune bonne solution n'a été fournie.
Toute aide serait grandement appréciée!
EDIT: J'appelle ToAscii()
pour convertir le code virtuel clé et code de balayage reçu dans ma LowLevelKeyboardProc fonction de crochet dans le caractère résultant qui sera affiché à l'écran pour l'utilisateur.
J'ai essayé MapVirtualKey(kbHookData->vkCode, 2)
, mais ce n'est pas aussi "complet" une fonction que ToAscii()
; Par exemple, si vous appuyez sur Maj + 2, vous obtiendrez '2', pas '@' (ou tout ce que Shift + 2 produira pour la disposition/langue du clavier de l'utilisateur).
ToAscii()
est parfait ... jusqu'à ce qu'une touche morte soit enfoncée.
EDIT2: est ici la fonction de crochet, avec des informations non pertinentes enlevé:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}
Veuillez indiquer le code d'appel de ToUnicode(). Où obtenez-vous le paramètre lpKeyState? – jdigital
@jdigital: Eh bien, j'appelle personnellement ToAscii, mais j'ai lu que ça arrive aussi avec ToUnicode. Mon appel est essentiellement ToAscii (kbHookData-> vkCode, kbHookData-> scanCode, GetKeyboardState(), & lpchar, 0) dans la fonction de hook WH_KEYBOARD_LL. Lorsque l'appel ToAscii renvoie -1, cela signifie qu'une touche morte a été enfoncée ... et la clé morte est 'détruite' comme je l'ai expliqué ci-dessus. – 00010000
J'ai supprimé ma réponse, il était complètement incorrect basé sur l'hypothèse que vous faisiez référence à des fonctions c-runtime pour convertir des chaînes plutôt que Win32 apis pour convertir des scancodes ... désolé. –