touche Controle et AltGr

Le
Vincent Torri
Donc 'key' est le keycode. Cette valeur, ainsi que la veaeur renvoyée par
GetKeyState() est exactement la même, que j'appuie sur Ctrl gauche ou
AltGr.

J'ai lu la doc de MSDN, cherché sur Google et fait des tests dans tous les
sens depuis 2 jours, sans rien trouver. Comme ça me paraît étrange que ce
soit si difficile de différencier ces 2 Ctrl gauche, je dois passer à côté
de quelque chose de simple.

Donc si quelqu'un a une idée pour résoudre le problème

merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #24008661
Vincent Torri a écrit :
Donc 'key' est le keycode. Cette valeur, ainsi que la veaeur renvoyée par
GetKeyState() est exactement la même, que j'appuie sur Ctrl gauche ou
AltGr.
J'ai lu la doc de MSDN, cherché sur Google et fait des tests dans tous les
sens depuis 2 jours, sans rien trouver. Comme ça me paraît étrange que ce
soit si difficile de différencier ces 2 Ctrl gauche, je dois passer à côté
de quelque chose de simple.
Donc si quelqu'un a une idée pour résoudre le problème...



Pour tester AltGr =>

if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0)
{
//...
Vincent Torri
Le #24009191
Christian ASTOR news:jattp2$jmt$:

Pour tester AltGr =>

if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0)
{
//...




Ben, je ne vois pas en quoi ça m'aide. Je fais ceci:

switch (key)
{
case VK_CONTROL:
printf("VK_CONTROL : %d %dn",
GetKeyState(VK_LCONTROL),
GetKeyState(VK_RMENU));
break;
case VK_MENU:
printf("VK_MENU : %d %dn",
GetKeyState(VK_LCONTROL),
GetKeyState(VK_RMENU));
break;
}

quand j'appuie sur le Ctrl gauche, ceci s'affiche (alternativement) :

VK_CONTROL : -127 0

VK_CONTROL : -128 0

quand j'appuie sur AltGr :

VK_CONTROL : -128 0
VK_MENU : -128 -127

VK_CONTROL : -127 1
VK_MENU : -127 -128

Donc il y a un cas où les valeurs renvoyée par GetStateKey() sont
identiques : -128 0

Donc, je ne peux pas différencier le cas où j'appuie sur Ctrl gauche et
le Ctrl gauche envoyé par AltGr.
Christian ASTOR
Le #24009571
Vincent Torri a écrit :
Christian ASTOR news:jattp2$jmt$:

Pour tester AltGr =>

if (GetKeyState(VK_RMENU)< 0 && GetKeyState(VK_LCONTROL)< 0)
{
//...




Ben, je ne vois pas en quoi ça m'aide.






Si, c'est la méthode standard pour tester AltGr.
Il suffit de la mettre dans le timer de la WndProc principale pour
tester et on voit que ça marche

SetTimer(hWnd, 1, 100, NULL);

et

case WM_TIMER:
{
if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0)
Beep(200,100);
}
break;
Vincent Torri
Le #24009621
Christian ASTOR @speranza.aioe.org:

Vincent Torri a écrit :
Christian ASTOR news:jattp2$jmt$:

Pour tester AltGr =>

if (GetKeyState(VK_RMENU)< 0 && GetKeyState(VK_LCONTROL)< 0)
{
//...




Ben, je ne vois pas en quoi ça m'aide.






Si, c'est la méthode standard pour tester AltGr.
Il suffit de la mettre dans le timer de la WndProc principale pour
tester et on voit que ça marche

SetTimer(hWnd, 1, 100, NULL);

et

case WM_TIMER:
{
if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0)
Beep(200,100);
}
break;




c'est bizarre, mais il ne me semble pas avoir lu dans ta première réponse
qu'il fallait utiliser un timer...

Et comment j'intègre ça dans mon switch ? Car franchement, tes réponses
sont ultra courtes.
Christian ASTOR
Le #24009721
Vincent Torri a écrit :

c'est bizarre, mais il ne me semble pas avoir lu dans ta première réponse
qu'il fallait utiliser un timer...



Je n'ai pas dit d'utiliser un timer, c'est juste une façon rapide pour
tester que le test est bon.
On met le test dans une fonction par exemple et on l'appelle où l'on
veut ensuite (dans "case WM_CHAR:" en principe)
torri
Le #24011541
On Mon, 28 Nov 2011 09:10:00 +0100, Christian ASTOR wrote:

Vincent Torri a écrit :

c'est bizarre, mais il ne me semble pas avoir lu dans ta première
réponse qu'il fallait utiliser un timer...



Je n'ai pas dit d'utiliser un timer, c'est juste une façon rapide pour
tester que le test est bon.
On met le test dans une fonction par exemple et on l'appelle où l'on
veut ensuite (dans "case WM_CHAR:" en principe)



Ok. Je vais peut-être faire autrement : apparemment, quand j'appuie sur
AltGr, le message KEYDOWN pour le 'fake' Ctrl est lancé, puis tout de
suite, le message KEYDOWN pour le Alt est lancé, avec le même timestamp.
Donc je vais utiliser PeekMessage avec NO_REMOVE quand je reçois un
KEYDOWN pour un Ctrl gauche, et voir si le message suivant est un KEYDOWN
pour un Alt gauche avec le même timestamp.

Trouves-tu ceci raisonnable ?
Christian
Le #24012421
torri a écrit :
On Mon, 28 Nov 2011 09:10:00 +0100, Christian ASTOR wrote:
Vincent Torri a écrit :
c'est bizarre, mais il ne me semble pas avoir lu dans ta première
réponse qu'il fallait utiliser un timer...



Je n'ai pas dit d'utiliser un timer, c'est juste une façon rapide pour
tester que le test est bon.
On met le test dans une fonction par exemple et on l'appelle où l'on
veut ensuite (dans "case WM_CHAR:" en principe)



Ok. Je vais peut-être faire autrement : apparemment, quand j'appuie sur
AltGr, le message KEYDOWN pour le 'fake' Ctrl est lancé, puis tout de
suite, le message KEYDOWN pour le Alt est lancé, avec le même timestamp.
Donc je vais utiliser PeekMessage avec NO_REMOVE quand je reçois un
KEYDOWN pour un Ctrl gauche, et voir si le message suivant est un KEYDOWN
pour un Alt gauche avec le même timestamp.
Trouves-tu ceci raisonnable ?



Pas trop non :-)
Je ne comprends pas pourquoi ne pas utiliser ce simple test, plutôt dans
WM_KEYDOWN que WM_CHAR en fait, ce qui est plus standard.
Windows lui-même l'utilise dans le Shell, au niveau des menus...
torri
Le #24012501
On Mon, 28 Nov 2011 21:32:33 +0100, Christian wrote:

torri a écrit :


Pas trop non :-)



Ca me semble très raisonnable, pourtant :-)

Je ne comprends pas pourquoi ne pas utiliser ce simple test, plutôt dans
WM_KEYDOWN que WM_CHAR en fait, ce qui est plus standard. Windows
lui-même l'utilise dans le Shell, au niveau des menus...



Je trouve que l'utilisation d'un timer est super bizarre, juste pour
tester si une touche arrive un petit peu après une autre, dans un cas
comme celui-ci, surtout si on sait que le timestamp de ces 2 touches est
exactement le même.

Et franchement, faire confiance à ce que fait Windows, mouais. Vu comment
c'est galère de faire certaines choses, j'ai des doutes : le problème en
question (AltGr), la notification de fichiers/répertoires, les layered
windows, les named/unnamed pipes pour de l'IPC (émulation de AF_UNIX),
etc... J'ai touché à tout ça, passé des mois à trouver comment ça
marche ; j'ai eu énormément d'avis contradictoires, donc pour se faire
une opinion c'est galère (Et quelques fois sans pouvoir résoudre mes
problèmes (les layered windows, je bloque toujours))

J'ai fait le code avec la méthode que j'ai décrite (je l'ai trouvée dans
le port Windows du server X de Xorg). J'essaierai ta méthode. Si les 2
marchent, j'en choisirai une.

merci pour la réponse
Christian ASTOR
Le #24012731
torri a écrit :

Je ne comprends pas pourquoi ne pas utiliser ce simple test, plutôt dans
WM_KEYDOWN que WM_CHAR en fait, ce qui est plus standard. Windows
lui-même l'utilise dans le Shell, au niveau des menus...



Je trouve que l'utilisation d'un timer est super bizarre, juste pour
tester si une touche arrive un petit peu après une autre, dans un cas
comme celui-ci, surtout si on sait que le timestamp de ces 2 touches est
exactement le même.



Comme je disais, le timer était juste pour vérifier rapidement que le
test marche, ça ne sert à rien !
Il faut juste faire, par exemple :
case WM_KEYDOWN:
{
if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0)
{
// Traitement pour AltGr
}
}
break;
torri
Le #24016891
On Tue, 29 Nov 2011 02:03:06 +0100, Christian ASTOR wrote:

Comme je disais, le timer était juste pour vérifier rapidement que le
test marche, ça ne sert à rien !
Il faut juste faire, par exemple :
case WM_KEYDOWN:
{
if (GetKeyState(VK_RMENU) < 0 && GetKeyState(VK_LCONTROL) < 0) {
// Traitement pour AltGr
}
}
break;



ce test arrive trop tard : le keydown pour le Ctrl envoyé par AltGr est
déjà reçu, et le test est vrai que après. L'ordre est:

1) j'appuie sur AltGr
2) KEYDOWN est envoyé pour la touche Ctrl gauche
3) le test est faux, donc je gère la touche Ctrl gauche (ce qui n'est pas
bon)
4) KEYDOWN est envoyé, pour la touche Alt droit
5) le test est vrai, mais de toute façon il ne me sert plus
6) Je gère Alt droit.

Donc, ce que je veux, c'est à l'étape 2), savoir si la touche Ctrl gauche
est celle d'un appuie de AltGr
Publicité
Poster une réponse
Anonyme