Avec VB.NET, pour détecter la frappe d'une touche on pense à utiliser les évenements KeyPress ou mieux KeyDown, KeyUp

Le résultat est parfois incorrect :
- certaines touches mal ou pas détectées (notamment les flèches et autres touches spéciales)
- un autre contrôle prenant le focus, il faut reprendre la souris en main et cliquer pour que le clavier soit de nouveau opérationnel

C'est dommage car d'un point de vue ergonomie cela rend difficile de faire un appli pilotable uniquement au clavier pour les personnes ayant du mal à utiliser une souris.

Le plus pratique est de gérer le clavier uniquement au niveau de la form ; le code suivant gère les flèches, et la combinaison de touches shift + pgup / shift + pgdn ou les touches 9 et 3 du pavé numérique provoquent le même effet que la molette de la souris (dans mon appli pour zoomer dans une image au clavier) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
    'Ajouter cette sub dans le code de la form pour gérer le clavier au lieu d'utiliser les événements .KeyPress / .KeyUp / .KeyDown des contrôles :
    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
        Dim e As MouseEventArgs
        Dim X As Integer, Y As Integer
 
        Select Case keyData
            Case CType(Keys.PageUp + Keys.Shift, Keys), Keys.NumPad9
                X = ImgXY.Left + ImgXY.Width \ 2
                Y = ImgXY.Top + ImgXY.Height \ 2
                e = New MouseEventArgs(Windows.Forms.MouseButtons.None, 0, X, Y, 100)
                Me.OnMouseWheel(e)
                Return True
            Case CType(Keys.PageDown + Keys.Shift, Keys), Keys.NumPad3
                X = ImgXY.Left + ImgXY.Width \ 2
                Y = ImgXY.Top + ImgXY.Height \ 2
                e = New MouseEventArgs(Windows.Forms.MouseButtons.None, 0, X, Y, -100)
                Me.OnMouseWheel(e)
                Return True
 
            Case Keys.Escape
                Me.Hide()
                Return True
 
           Case Keys.Subtract, Keys.OemMinus
                Call CoucheMoins()
                Return True
           Case Keys.Add, Keys.Oemplus
                Call CouchePlus()
                Return True
 
            Case Keys.Down
                Call CoucheMoins()
                Return True
            Case Keys.Up
                Call CouchePlus()
                Return True
 
            Case Keys.Left
                Call PhaseMoins()
                Return True
            Case Keys.Right
                Call PhasePlus()
                Return True
            Case Keys.PageUp
                Call FichierPlus()
                Return True
            Case Keys.PageDown
                Call FichierMoins()
                Return True
        End Select
 
        'Ici la touche tapée n'a pas été capturée, elle est renvoyée vers la fenêtre pour un usage normal du clavier :
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function
Evidemment, ne capturez pas les touches servant à taper du texte si votre form contient des zones de texte