Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trouver la touche enfoncée

Touvée touche enfoncée sans trigger ou event

    15 décembre 2021 à 10:58:47

    Hello, 
    Je cherche depuis un jour une solution pour pouvoir touver quel touche est enfoncée sur le clavier de l'utilisateur. Mon workflow est : On clique sur un bouton et une fois cela fait je dois attendre que l'utilisateur appuies sur une touche pour l'assignée a un contrôle. Je butte sur le "je dois attend que l'utilisateur appuis sur une touche".

    J'ai tenté quelque chose avec un do while et une boucle for qui ne fonctionne pas. Je pense que si l'on appuie pas pile quand dans la boucle nous sommes au caractère appuyé ça ne fonctionne pas. Voilà mon exemple de code : 

            private Key getDownKey()
            {
                do
                {
                    foreach (Key key in Enum.GetValues(typeof(Key)))
                        if (key != Key.None && Keyboard.IsKeyDown(key))
                            return key;
                } while (!Keyboard.IsKeyDown(Key.Escape));
                
                return Key.None;
            }

    Je pense que c'est une mauvaise idée. Je ne sais pas si vous avez des conseils à me donner ?

    Une deuxième solution est présente sur stackoverflow mais elle n'est pas très concluante car je dois faire une convertion en théorie.

    [DllImport("user32.dll", EntryPoint = "GetKeyboardState", SetLastError = true)]
    private static extern bool NativeGetKeyboardState([Out] byte[] keyStates);
    
    private static bool GetKeyboardState(byte[] keyStates)
    {
        if (keyStates == null)
            throw new ArgumentNullException("keyState");
        if (keyStates.Length != 256)
            throw new ArgumentException("The buffer must be 256 bytes long.", "keyState");
        return NativeGetKeyboardState(keyStates);
    }
    
    private static byte[] GetKeyboardState()
    {
        byte[] keyStates = new byte[256];
        if (!GetKeyboardState(keyStates))
            throw new Win32Exception(Marshal.GetLastWin32Error());
        return keyStates;
    }
    
    private static bool AnyKeyPressed()
    {
        byte[] keyState = GetKeyboardState();
        // skip the mouse buttons
        return keyState.Skip(8).Any(state => (state & 0x80) != 0);
    }

    J'ai regarder pour des hotkeys mais il faut connaître les touches en avance et je souhaiterai éviter ça. Depuis ma classe je n'ai pas accès au WPF, je souhaiterai le faire sans. Auriez-vous des pistes ?
    J'ai l'impression d'avoir lu sur le MSDN tout ce qui avait un rapport avec Keyboard et ses EventHandler qui en découle.

    Merci d'avance! N'hésitez pas si vous avez une question !
    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2021 à 11:45:19

      pour moi, il n'y a que par l'utilisation d'un événement que tu peux déterminer la touche appuyée (événement seulement "actif" quand tu en as besoin)
      • Partager sur Facebook
      • Partager sur Twitter
        15 décembre 2021 à 12:00:08

        Oui mais j'aimerai savoir s'il y a une autre possibilité. J'ai trouvé quelques pistes mais pas faisable dans le contexte que j'ai.
        • Partager sur Facebook
        • Partager sur Twitter
          15 décembre 2021 à 18:33:36

          >Oui mais j'aimerai savoir s'il y a une autre possibilité.

          Oui, il y en a plein (driver d'interception, bibliothèques comme DirectInput, et les event c'est bien aussi, etc...), mais votre approche est tellement "naïve" qu'elle montre votre absence totale de connaissances en programmation système.

          >J'ai trouvé quelques pistes mais pas faisable dans le contexte que j'ai.

          Et c'est quoi votre contexte déjà ???

          J'ai plus l'impression que vous ne les comprenez pas.

          >Depuis ma classe je n'ai pas accès au WPF, je souhaiterai le faire sans. Auriez-vous des pistes ?

          C'est quoi le rapport entre les "hotkeys" et WPF ???

          Vous faite un code pour configurer des raccourcis et il n'a pas accès à la librairie d'IHM ? C'est "ballot". Y aurait comme un problème d'architecture que cela ne m'étonnerait pas.

          Vous nous expliquez pas pourquoi une simple approche par event ne peut pas convenir ?

          On ne peut pas vous guidez dans les méandres de la programmation système sans savoir pourquoi la méthode "bébête" ne vous convient pas.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

          Trouver la touche enfoncée

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown