touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 2 février 2007
-
31 janv. 2007 à 16:09
touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDerniè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 ...
touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDerniè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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDerniè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...
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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."
touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDerniè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
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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...
touf26
Messages postés11Date d'inscriptionmardi 25 avril 2006StatutMembreDerniè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.
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
'=-=-=-=-=-=-
'
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
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.