Evenement touche clavier

Résolu
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007 - 31 janv. 2007 à 16:09
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007 - 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

15 réponses

touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007
2 févr. 2007 à 09:22
Merci à vous deux, c'est vraiment sympa; je vais tester ce code et vous tiens au courant...
3
DD05 Messages postés 53 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 11 juin 2010 1
31 janv. 2007 à 23:02
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 févr. 2007 à 02:11
salut,
recherche avec "hook clavier"

++
0
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007
1 févr. 2007 à 09:50
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 févr. 2007 à 10:56
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.
0
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007
1 févr. 2007 à 11:45
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...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 févr. 2007 à 12:14
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."
0
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007
1 févr. 2007 à 13:24
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 févr. 2007 à 15:33
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...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 févr. 2007 à 15:37
Je précise : ce que j'ai dit concerne les boutons de commandes, pas le reste.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 févr. 2007 à 16:18
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
0
touf26 Messages postés 11 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 2 février 2007
1 févr. 2007 à 16:28
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 févr. 2007 à 16:31
quelle(s) touche(s) ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 févr. 2007 à 17:15
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 févr. 2007 à 17:26
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.
0
Rejoignez-nous