VB.NET: Bloquer temporairement certaines touches du clavier

Résolu
Anonyme209 Messages postés 761 Statut Membre -  
Anonyme209 Messages postés 761 Statut Membre -
Bonjour,

Je voudrais pouvoir bloquer temporairement certaines touches du clavier, comme par exemple Ctrl, Alt, Windows, Alt gr....
Merci de votre aide.

9 réponses

  1. Anonyme209 Messages postés 761 Statut Membre 19
     
    Bonjour,
    converti ça donne ça:

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
            'Si VERR.MAJ alors les touches au dessus de AZERTY seront des chiffres, on laisse faire 
            If Console.CapsLock Then
                Return MyBase.ProcessCmdKey(msg, keyData)
            End If
            Select Case (keyData)
                Case Keys.D0, Keys.D1, Keys.D2, Keys.D3, Keys.D4, Keys.D5, Keys.D6, Keys.D7, Keys.D8, Keys.D9
                    'c'est l? qu'on transforme en chiffre
                    'msg.WParam correspond au KeyCode de la touche, il suffit d'applique "une translation"
                    '+= ne focntionne pas donc je le fais en 2 lignes
                    Dim MonChiffre As Integer = (CType(msg.WParam, Integer) + 48)
                    msg.WParam = CType(MonChiffre, IntPtr)
                    Return MyBase.ProcessCmdKey(msg, keyData)
                Case Else
                    Return MyBase.ProcessCmdKey(msg, keyData)
            End Select
        End Function


    Mais j'aimerais savoir comment l'utiliser. Par exemple, quand et surtout comment appeler la fonction.
    0
  2. Utilisateur anonyme
     
    Tu dérives le contrôle sur lequel tu tapes (par défaut ta form) et tu mets ce code dans la classe dérivée.
    0
  3. Anonyme209 Messages postés 761 Statut Membre 19
     
    Bonjour,

      
      Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
            Select Case (keyData)
                Case Keys.ControlKey, Keys.Alt, Keys.LWin, Keys.RWin, Keys.Tab, Keys.Escape, Keys.Enter, Keys.F1, Keys.F2, Keys.F3, Keys.F4, Keys.F5, Keys.F6, Keys.F7, Keys.F8, Keys.F9, Keys.F10, Keys.F11, Keys.F12, Keys.F13, Keys.F14, Keys.F15, Keys.F16, Keys.F17, Keys.F18, Keys.F19, Keys.F20, Keys.F21, Keys.F22, Keys.F23, Keys.F24
                    'c'est l? qu'on transforme en chiffre
                    'msg.WParam correspond au KeyCode de la touche, il suffit d'applique "une translation"
                    '+= ne focntionne pas donc je le fais en 2 lignes
                    Dim MonChiffre As Integer = (CType(msg.WParam, Integer) + 48)
                    msg.WParam = CType(MonChiffre, IntPtr)
                    Return MyBase.ProcessCmdKey(msg, keyData)
                Case Else
                    Return MyBase.ProcessCmdKey(msg, keyData)
            End Select
    End Function


    Avec un break-point, je vois que ça ne fonctionne que pour les touches Windows et Tab, Entrée et Echap, les autres touches (Ctrl, Alt, tous les F numéro) ne sont pas détectées par le programme.
    De plus, j'aimerais connaître le code pour "annuler" l'action de ces touches, et pour qu'aucune action ne soit effectuée.
    0
    1. Utilisateur anonyme
       
      Pour les touches à annuler
      Return False


      Pour celles qui ne marche pas, je ne sais pas. Je jette un oeil
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
        En fait
        Return True
        0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Utilisateur anonyme
     
    J'ai dérivé un TextBox (plus facile qu'une Form pour voir ce que l'on tape...)

    Public Class TextBoxSaisieControle
        Inherits TextBox
    
        Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    
            If keyData.HasFlag(Keys.Control) OrElse keyData.HasFlag(Keys.Alt) Then
                Return True
            End If
    
            Select Case keyData
    
                Case Keys.F5
                    Return True
    
    
                Case Else
                    Return MyBase.ProcessCmdKey(msg, keyData)
            End Select
        End Function
    
    End Class


    Ceci fonctionne chez moi.
    J'utilise HasFlag parce qu'avec le point d'arrêt on voir pour Alt que keyData vaut
    Keys.RButton Or Keys.ShiftKey Or Keys.Alt
    , même idée pour Contrôle.

    Par contre F5 passe (je ne peux pas tester les autres sur mon clavier)
    0
  6. Anonyme209 Messages postés 761 Statut Membre 19
     
      If keyData.HasFlag(Keys.Control) OrElse keyData.HasFlag(Keys.Alt) Then
                Return True
            End If
    
            Select Case keyData
                Case Keys.F1
                    Return True
                Case Keys.F2
                    Return True
                Case Keys.F3
                    Return True
                Case Keys.F4
                    Return True
                Case Keys.F5
                    Return True
                Case Keys.F6
                    Return True
                Case Keys.F7
                    Return True
                Case Keys.F8
                    Return True
                Case Keys.F9
                    Return True
                Case Keys.F10
                    Return True
                Case Keys.F11
                    Return True
                Case Keys.F12
                    Return True
                Case Keys.F13
                    Return True
                Case Keys.F14
                    Return True
                Case Keys.F15
                    Return True
                Case Keys.LWin
                    Return True
                Case Keys.RWin
                    Return True
                Case Else
                    Return MyBase.ProcessCmdKey(msg, keyData)
            End Select


    Ca bloque les touches Ctrl et Alt, mais pas les touches Windows et Fx
    0
  7. Utilisateur anonyme
     
    Bonjour, je ne peux pas essayer (j'ai un Mac donc pas de touche Windows...)
    Si par Fx tu entends F1, F2, F3 etc... de même sur mon clavier Mac y'a que F5 et F6 qui passent chez moi, et chez moi ce code les bloque.

    Donc pour la touche Windows as tu essayé de regarder la valeur de keyData avec un point d'arrêt? Si oui qu'est ce que ça vaut? Sinon qu'attends tu?
    0
  8. Anonyme209 Messages postés 761 Statut Membre 19
     
    Keys.LWin LWin {91} System.Windows.Forms.Keys
    0
  9. Utilisateur anonyme
     
    OK as tu essayé de faire le test avec HasFlag?
    0
    1. Anonyme209 Messages postés 761 Statut Membre 19
       
      Bonjour,

      Excusez-moi de ne pas avoir répondu plus tôt.
      Avec HasFlag, la valeur de Keys.LWin est toujours 91.
      De plus avec un breakpoint je peux voir que Return True est bien exécuté, mais cela n'empêche pas le menu démarrer de s'afficher.
      0
    2. Anonyme209 Messages postés 761 Statut Membre 19
       
      Bonjour,

      Mon problème est résolu. En faisant des recherches un peu plus poussées (et surtout en anglais), j'ai trouvé ceci: https://www.daniweb.com/programming/software-development/threads/359374/disable-alt-tab-win-key-ctrl-esc-key
      Il faut désactiver le processus d'hébergement Visual Studio pour le déboguage, mais les touches sont bien rendues non fonctionnelles.
      Par contre, comme je m'y attendais, je n'ai pas réussi à bloquer Ctrl + Alt + Suppr, mais ce n'est pas vraiment un problème, je n'ai qu'à tuer automatiquement les processus taskmgr et taskkill avant que ce ne soit eux qui tuent le processus de mon application.

      Merci de votre aide.
      0