OVH Cloud OVH Cloud

KeyCode et Shift

7 réponses
Avatar
Daniel - Z
Bonjour.

J'utilise la fonction KeyDown qui me permet de savoir quelle touche du =
clavier l'utilisateur a appuy=E9.

J'ai cr=E9=E9 un jeu et je voudrais =EAtre capable d'utiliser les deux =
touches Shift (majuscule gauche et droite). Le probl=E8me, c'est qu'ils =
ont tous les deux le m=EAme KeyCode, m=EAme chose pour certaines autres =
touches comme ALT et CTRL.

Comment d=E9tecter lequel des deux Shift l'utilisateur appuie-il ?

Merci d'avance.

=AF=AF=AF=AF=AF=AF=AF=AF=AF=AF=AF=AF
Cordialement
Daniel - Z

7 réponses

Avatar
Alain Cotterot
Salut

shift est le second argument de l'évenement Keydown et indique par
codification binaire si une des touches SHIFT, CTRL ou ALT est pressée

If shift and vbctrlMask <> 0 (Code si CTRL appuyé)

if shift and vbaltMask <> 0 (code si ALT est appuyé)

if shift and vbShiftMask <> 0 (code si SHIFT est appuyé)

Chacune des trois options n'élimine pas les autres


Alain Cotterot


Daniel - Z a écrit dans le message :
#
Bonjour.

J'utilise la fonction KeyDown qui me permet de savoir quelle touche du
clavier l'utilisateur a appuyé.

J'ai créé un jeu et je voudrais être capable d'utiliser les deux touches
Shift (majuscule gauche et droite). Le problème, c'est qu'ils ont tous les
deux le même KeyCode, même chose pour certaines autres touches comme ALT et
CTRL.

Comment détecter lequel des deux Shift l'utilisateur appuie-il ?

Merci d'avance.

¯¯¯¯¯¯¯¯¯¯¯¯
Cordialement
Daniel - Z
Avatar
jmn
l'api GetKeyState (win32) permet de retrouver l'état d'une touche du clavier
(y compris les shifts droit et gauche). si l'on considère qu'entre le moment
où l'évènement form_keydown est invoqué et les premières instructions de la
procèdures la touche sera toujours enfoncée, alors un appel à cette API
devrait faire l'affaire.
Avatar
Daniel - Z
Bonjour.

Mais cela me permet-il de différencier lequel des 2 Shift a été pressé ? Si oui, un exemple plus concret peut-être ?

Désolé de mon inexpérience.
Merci d'avance.

¯¯¯¯¯¯¯¯¯¯¯¯
Cordialement
Daniel - Z
Avatar
Zoury
Salut! :O)

Voici un exemple d'utilisation de l'API en question..

'***
' Form1, KeyPreview = True
' 1 Timer
' 1 Label
Option Explicit

Private Declare Function GetKeyState _
Lib "user32" _
( _
ByVal nVirtKey As Long) _
As Integer

Private Const VK_LSHIFT = &HA0
Private Const VK_RSHIFT As Long = &HA1
Private Const VK_LCONTROL As Long = &HA2
Private Const VK_RCONTROL As Long = &HA3
Private Const VK_LMENU As Long = &HA4
Private Const VK_RMENU As Long = &HA5

Function GetPressedKey() As String

Dim key As Long
For key = VK_LSHIFT To VK_RMENU

' Vérifie l'état de la clé
' Si le bit le fort est à 1 alors la clé est enfoncé
' Si le bit le plus faible est à 1 alors la touche
' alors la touche est activé (comme le CAPSLOCK par exemple)
If ((GetKeyState(key) And &H80000000) = &H80000000) Then

' On vérifie quelle clé est enfoncée
Select Case key
Case VK_LSHIFT
GetPressedKey = _
GetPressedKey & "Left Shift" & vbNewLine
Case VK_RSHIFT
GetPressedKey = _
GetPressedKey & "Right Shift" & vbNewLine
Case VK_LCONTROL
GetPressedKey = _
GetPressedKey & "Left Control" & vbNewLine
Case VK_RCONTROL
GetPressedKey = _
GetPressedKey & "Right Control" & vbNewLine
Case VK_LMENU
GetPressedKey = _
GetPressedKey & "Left Alt" & vbNewLine
Case VK_RMENU
GetPressedKey = _
GetPressedKey & "Right Alt" & vbNewLine
End Select
End If

Next key

If (LenB(GetPressedKey) > 0) Then
GetPressedKey = Left$(GetPressedKey, Len(GetPressedKey) - 2)
Else
GetPressedKey = "Appuyer sur les touches"
End If

End Function

Private Sub Form_Load()
Call Me.Move(Me.Left, Me.Top, 5000, 5000)
Call Label1.Move(0, 0, Me.ScaleWidth, Me.ScaleHeight)
Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Form_Resize()
Call Label1.Move(0, 0, Me.ScaleWidth, Me.ScaleHeight)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
Label1.Caption = GetPressedKey
End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"jmn" wrote in message
news:
l'api GetKeyState (win32) permet de retrouver l'état d'une touche du


clavier
(y compris les shifts droit et gauche). si l'on considère qu'entre le


moment
où l'évènement form_keydown est invoqué et les premières instructions de


la
procèdures la touche sera toujours enfoncée, alors un appel à cette API
devrait faire l'affaire.




Avatar
Zoury
ah oui j'oubliais. l'exemple est tiré d'un message anglophone que j'ai
trouvé. :O)
bon.
voilà.
Avatar
Daniel - Z
Bonjour.

Merci pour cet exemple, il devrait être d'une grande utilité.
Par contre j'ai constaté que le code était assez long.
Je vais tout tester, et si j'ai bien regarder ce code, lors de l'appui sur l'un des Shift on devrait voir apparaître le nom du Shift dans le label, ce qui confirmerait donc la détection des Shift gauche et droit. Je ne suis présentement pas à mon bureau de travail, je testerai donc plutard.

Merci encore.

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Cordialement
Daniel - Z
Avatar
Zoury
Salut Daniel! :O)

: Par contre j'ai constaté que le code était assez long.

Yep. et la seule ligne reellement utile dans ton cas se resume a ceci :

<non teste>
'***
Debug.Print "Shift Gauche : " & _
(GetKeyState(VK_LSHIFT) And &H80000000) = &H80000000
Debug.Print "Shift Droit : " & _
(GetKeyState(VK_RSHIFT) And &H80000000) = &H80000000
'***

le reste n'etant que pour demontrer le fonctionnement...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/