Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

touche Controle et AltGr

12 réponses
Avatar
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

10 réponses

1 2
Avatar
Christian ASTOR
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)
{
//...
Avatar
Vincent Torri
Christian ASTOR wrote in
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.
Avatar
Christian ASTOR
Vincent Torri a écrit :
Christian ASTOR wrote in
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;
Avatar
Vincent Torri
Christian ASTOR wrote in news:jauojc$o0h$1
@speranza.aioe.org:

Vincent Torri a écrit :
Christian ASTOR wrote in
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.
Avatar
Christian ASTOR
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)
Avatar
torri
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 ?
Avatar
Christian
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...
Avatar
torri
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
Avatar
Christian ASTOR
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;
Avatar
torri
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
1 2