[Déplacé VBA]Pouvoir executer une procédure associée à une touche à tout moment

Résolu
kersu - 11 août 2012 à 11:02
 kersu - 12 août 2012 à 12:36
Bonjour,

j ai programmé une aide à la décision au poker. Le programme fonctionne, mais je souhaiterai pouvoir appuyer sur la touche "A" pour passer au coup suivant et éviter de clicker sur des Optionbuttons.

Mon code est contenu dans un UserForm et lorsque je code :

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 65 Then
        MsgBox "essai pour passer au coup suivant"
End If
End Sub


Cette procédure est ignorée.

Merci de m aider.

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 août 2012 à 14:35
Salut

La solution précaunisée par ucfoutu ne fonctionne pas sous VBA, les UserForm n'ayant pas cet attribut KeyPreview.

Je viens de faire l'essai et je suis aussi étonné de voir que KeyDown ou KeyPress ne réagissent pas.
En fait, ces procédures se déclenchent bien mais à condition qu'il n'y ait aucun objet sur la forme - peu exploitable.

Autre solution : Attribuer une lettre à Accelerator, lettre qui doit se trouver dans le texte du bouton associé. Dans ce cas, la touche de raccourci sera Alt-a, c'est à dire la touche Alt en même temps que la lettre choisie, lettre qui apparait soulignée dans le texte du bouton.

Dernière solution : utiliser les APIs pour espionner le clavier, avec GetKeyState. Tu trouveras un exemple de code dans http://logiciel.codes-sources.com/logiciels/API-Guide-197.aspx.
Attention toute fois : cette API est considérée comme dangereuse pour les antivirus/antispyware, car utilisable pour l'espionnage. Donc si tu dois installer ton programme sur d'autres machines, ça risque de coincer.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 août 2012 à 18:38
Ouais ...
Alors voilà :

Private Type Msg
    hwnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
End Type
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private monhwnd As Long, basta As Boolean
  
Private Sub userform_Initialize()
   monhwnd = FindWindowA(vbNullString, Me.Caption)
    basta = False
    RegisterHotKey monhwnd, &HBFFF&, 0, vbKeyA
    Show
    ProcessMessages
End Sub

Private Sub ProcessMessages()
    Dim Message As Msg
    Do While Not basta
        WaitMessage
        If PeekMessage(Message, monhwnd, &H312, &H312, &H1) Then
            MsgBox "voila ! tu viens de presser la touche A ! mets ici tes instructions à la ^place de ce msgbox"
        End If
        DoEvents
    Loop
End Sub

Private Sub UserForm_Terminate()
 basta = True
 UnregisterHotKey monhwnd, &HBFFF&
End Sub

Lance, presse la touche A et vois ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 août 2012 à 11:24
Bonjour,
A lire

Tapez le texte de l'url ici.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Merci ucfoutu.

Donc je comprends effectivement il faut résonner focus et donner la possibilité à l'utilisateur d appuyer sur la touche "A" au moment où il a la main. J ai modifié mon code, mais cela ne marche toujours pas


Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 65 Then
        MsgBox "essai passé coup suivant"
        Application.Wait Now + TimeValue("00:00:3")
        j1.Value = True
End If
End Sub


'***************************************************************************
'******************* programme principal ***********************************
'***** quand la partie commence et que je suis en deuxième de parole  ******

Private Sub j2_Click()
    j1.Enabled = False
    position = 2
    nb_main_joue = nb_main_joue + 1
    nbmain.Caption = nb_main_joue
    anbbluff.Caption = Int((nb_bluff / nb_main_joue) * 100) & "%"
    
'1. j'efface et j'affiche la réaction de mon adversaire avant flop
    
    effacer_texte
    
    reaction_adversaire2.Visible True: reac1_adversaire2.Visible True: reac2_adversaire2.Visible = True
    reac3_adversaire2.Visible True: reac4_adversaire2.Visible True: reac5_adversaire2.Visible = True
    texte1_reaction_adversaire2.Visible True: texte2_reaction_adversaire2.Visible True
    texte3_reaction_adversaire2.Visible True: texte4_reaction_adversaire2.Visible True
    texte5_reaction_adversaire2.Visible = True
    
    KeyPreview = True

End Sub

'si l'adversaire abandonne
Private Sub reac1_adversaire2_Click()
    effacer_texte
    j1.Value = True
End Sub



Je souhaite donc soit appuyer sur la touche "A" pour passer au coup suivant, soit clicker sur reac1
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 août 2012 à 14:56
D'où l'absolue nécessité de respect du choix de la section dans laquelle on ouvre une discussion.
La présente, déplacée depuis dans la section Langages dérivés > VBA, avit été ouvrete dans la section VB.Net.
Ce ne sera que ce soir, que je reviendrai, avec la solution VBA !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Merci à vous deux. Je regarde tes solutions jack.

PS: Merci d'avoir déplacé le message dans la bonne section, je serais plus rigoureux la prochaine fois.
0
jack, merci.

Accelerator correspond bien à mon besoin, à savoir accélérer le programme en évitant de clicker. Je ne savais pas et pas vu qu'on pouvait aussi l'associer à un Optionbuttons.

ucfoutu, merci.

Le code correspond aussi ma demande. J'ai appris en bossant et en exécutant ton code. En particulier l utilisation de la boucle do while, comme tout débutant en prog, j ai tendance à faire des boucles qui tournent à l infini lol. (bien aussi d utiliser le libellé basta pour un booléen :))))

J'accepte la réponse pour clôturer le post.
0
Rejoignez-nous