Evenement touche clavier [Résolu]

touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 31 janv. 2007 à 16:09 - Dernière réponse : touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention
- 2 févr. 2007 à 09:22
Bonjour,


Je voudrais à n'importe quel moment de mon application lancer une méthode lorsqu'on appuie sur une touche précise.


J'ai essayé avec l'événement keydown ou keypress du formulaire: ca marche mais dés que le formulaire n'a plus le focus donc dés qu'il y a d'autres contrôles ça ne marche plus car cet évenement est propre à la forme.


Quelqu'un aurait t-il une idée sans passer par un thread si possible ou alors en m'expliquant bien  ...

Merci d'avance
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 2 févr. 2007 à 09:22
3
Merci
Merci à vous deux, c'est vraiment sympa; je vais tester ce code et vous tiens au courant...

Merci touf26 3

codes-sources a aidé 87955 internautes ce mois-ci

Commenter la réponse de touf26
DD05 53 Messages postés mercredi 11 août 2004Date d'inscription 11 juin 2010 Dernière intervention - 31 janv. 2007 à 23:02
0
Merci
Tu crés 2 forms. Form1 et Form2. Tu ajoutes un module aussi.

Tu mets la propriété KeyPreview à True pour les 2 forms.

Dans la Form1 tu mets un bouton Command1.

Pour la Form1 tu tappes le code suivant. Ainsi, en cliquant sur le bouton Command1 présent sur ta Form1, tu ouvres la form2.


Private Sub Command1_Click()

Form2.Show

End Sub


Private Sub Form_KeyPress(KeyAscii As Integer)

 Mychar = KeyAscii     

 If (Mychar = 97) Then        
   ' Si la touche A est pressée, tu appelles la procédure
message présente dans ton module.

  Call message

 End If

End Sub


Pour la Form2 tu tappes le code suivant.


Private Sub Form_KeyPress(KeyAscii As Integer)

 Mychar = KeyAscii

 If (Mychar = 97) Then

  Call message

 End If

End Sub


Dans le module tu tappes le code suivant :


Sub message()

 TOTO = MsgBox("Tu viens d'appuyer sur la touche A ", vbInformation, "Message")

End Sub


Tu lances l'application. La Form1 s'ouvre. En tappant sur la touche A, le message apparait.

ensuite tu appuies sur le bouton command1. La form2 s'ouvre. Si tu appuies sur A, le message apparait aussi.


Donc quelque soit la Form dans laquelle tu as le focus, tu peux appeler une procédure.
Commenter la réponse de DD05
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 févr. 2007 à 02:11
0
Merci
salut,
recherche avec "hook clavier"

++
Commenter la réponse de PCPT
touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 1 févr. 2007 à 09:50
0
Merci
Merci pour les réponses, je n'ai pas encore regardé pour hook clavier, j'y vais de ce pas mais pour l'autre méthode ça marche.
Il n'y a qu'un petit soucis c'est que ça marche avec toutes les touches sauf celles que je veux. En fait je pilote un robot par le port série et j'utilise les flèches Up,Down,Right,Left et celles ci mettent le focus sur mon bouton donc ca ne marche plus. Peut on faire en sorte que l'appui sur ces touches n'influencent pas le focus?
Commenter la réponse de touf26
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 1 févr. 2007 à 10:56
0
Merci
joue avec l'événement keyup de ta form et non avec l'événement keypress et les valeurs 38 (flêche haute) 40 (flêche basse) 39 (flêche droite) et 37 (flêche gauche)

Attention : si tu es sur un bouton de ta Form, keydown et Keyup ne réagiront pas de la même façon et, au keydown, la touche ne serait pas immédiatement reconnue alors qu'elle l'est bien au Keyup.

J'"ai mal compris ton affaire en ce qui concerne la navigation par les flêches. S'il s'agit d'avoir la possibilité de naviguer de 2 manières différentes, selon le cas, parles-en avec la plus grande précision (exposé clair des gestes===>>réactions dans les 2 cas de figure) et je te donnerai alors la solution à ce double emploi des touches directionnelles.
Commenter la réponse de jmfmarques
touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 1 févr. 2007 à 11:45
0
Merci
Oui excuse moi pour le manque de détails:

En fait sur ma forme j'ai quatres boutons. Un pour envoyer une trame série qui fait avancer le robot, un pour envoyer une trame série qui le fait reculer et deux autres pour le faire tourner à droite et à gauche. Dans mon application, soit on peut cliquer directement sur les boutons, soit on peut utiliser les touches du clavier up pour avancer, down pour reculer, etc... Seulement je veux pouvoir laisser appuyer pour qu'il avance. L'événement keydown fonctionne avec toutes les touches, je récupère leur code comme tu dis mais pas pour les touches up,down,right,left.


Celles ci ne déclenchent pas l'évenement keydown du tout; Elles font seulement passer le focus d'un bouton à l'autre. Elle font défiler le focus en fait alors que je pensais que c'était le rôle de TAB. J'ai mis la propriété TAB STOP à FALSE au cas où mais pas mieux...
Commenter la réponse de touf26
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 1 févr. 2007 à 12:14
0
Merci
Relis bien (lentement) ma réponse : Evenement KeyUp, pas Keydown !

"joue avec l'événement keyup de ta form et non avec l'événement keypress et les valeurs 38 (flêche haute) 40 (flêche basse) 39 (flêche droite) et 37 (flêche gauche)

Attention : si tu es sur un bouton de ta Form, keydown et Keyup ne réagiront pas de la même façon et, au keydown, la touche ne serait pas immédiatement reconnue alors qu'elle l'est bien au Keyup."
Commenter la réponse de jmfmarques
touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 1 févr. 2007 à 13:24
0
Merci
Mais moi j'envoie un signal tant que le bouton est appuyé, si je prends l'événement keyUp, ma trame série ne sera envoyé qu'une fois quand je relacherais le bouton ???


Là quand sur mon événement keydown, ma trame est bien envoyée tant que j'ai mon bouton appuyé. Ca marche avec tout le clavier, ca c'est ok. Mais pas ces fichus touches up,left...


Je ne comprend peut être pas ce que tu m'expliques
Commenter la réponse de touf26
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 1 févr. 2007 à 15:33
0
Merci
Cette affaire là s'avère à l'expérience assez complexe, finalement, du fait que VB semble gérer (en amont) l'utilisation des flêches directionnelles !
Je crois qu'il va dans ces conditions faire des acrobaties diverses.

Je me propose de tenter de telles acrobaties ce soir, mais sous VB6 (la transposition devrait ne pas être complexe).
Si tu en es d'accord, bien sur...
Commenter la réponse de jmfmarques
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 1 févr. 2007 à 15:37
0
Merci
Je précise : ce que j'ai dit concerne les boutons de commandes, pas le reste.
Commenter la réponse de jmfmarques
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 févr. 2007 à 16:18
0
Merci
au risque de me répéter : hook clavier!
il n'y a pas 36 manières "propres"

API CallNextHookEx, GetKeyState, SetWindowsHookEx et UnhookWindowsHookEx

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
touf26 11 Messages postés mardi 25 avril 2006Date d'inscription 2 février 2007 Dernière intervention - 1 févr. 2007 à 16:28
0
Merci
Je pensais bien qu'il faisait des choses pas très catholique derrière. Bon je vais me creuser encore un peu le crâne et sinon j'utiliserais les flèches du PAD.
Mais si t'es bon en acrobaties et que tu trouves en VB6 fait moi signe.
Commenter la réponse de touf26
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 févr. 2007 à 16:31
0
Merci
quelle(s) touche(s) ?
Commenter la réponse de PCPT
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 févr. 2007 à 17:15
0
Merci
bon....

beh voilà en VB6 avec les flèches multidirectionnelles

'= -=-=-=-=-
'
Form1.frm
'=-=-=-=-=-
'
Option Explicit

Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance,
App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    UnhookWindowsHookEx hHook
End Sub

Public Sub ArrowRaiser(ByVal Arr As Arrows, ByVal UD As
UpDown)
    Static bBeforeAfter As Boolean
    bBeforeAfter = Not bBeforeAfter
    
    Dim sStr As String
    
    Select Case Arr
        Case ArrLeft:   sStr = "flèche gauche"
        Case ArrTop:    sStr = "flèche haut"
        Case ArrRight:  sStr = "flèche droite"
        Case ArrBottom: sStr = "flèche bas"
    End Select

     sStr = sStr & IIf(UD = Down, " enfoncée", " relachée") & IIf(bBeforeAfter, " - avant", " - après")
     
     Debug.Print sStr
End Sub

'=-=-=-=-=-=-
'
Module1.bas
'=-=-=-=-=-=-
'
Option Explicit
'
Public Const WH_KEYBOARD As Long = 2&
Public Const VK_SHIFT As Long = &H10
'
Public Enum Arrows
    ArrLeft = 37
    ArrTop = 38
    ArrRight = 39
    ArrBottom = 40
End Enum
'
Public Enum UpDown
    Down = 0
    Up = 1
End Enum
'
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As
Long
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As
Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As Long
Dim UD As UpDown, bRaise As Boolean
'
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If idHook < 0 Then
        bRaise = False
    Else
        Select Case wParam
            Case ArrLeft, ArrTop, ArrRight,
ArrBottom                If lParam > 0 Then UD Down Else UD
Up
                bRaise = True
            Case Else
                bRaise = False
        End Select
    End If
    KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    If bRaise Then Form1.ArrowRaiser ByVal wParam, ByVal UD
End Function

<small>Coloration
syntaxique automatique [AFCK] </small>
       

++
PCPT  [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 1 févr. 2007 à 17:26
0
Merci
Il a sinon la solution toute bête de remplacer ses commandButtons par des PictureBoxes (qui, elles, ne présentent pas le même problème).... et là, tout devient on ne peut plus simple.

Je me suis amusé à faire l'acrobate avec des CommanButtons et VB6 et y suis parvenu, mais ce n'est en effet pas une solition orthodoxe.

Alors : ou la solution de PCPT ou l'emploi de pictureBoxes à la place de boutons de commande.
Commenter la réponse de jmfmarques

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.