Question

J'utilise événement PreviewKeyDown sur une fenêtre pour recevoir toutes les clés d'un scanner de codes à barres. Les KeyEventArgs est une énumération et ne m'a pas livré la chaîne réelle. Je ne veux pas utiliser TextInput comme certaines touches peuvent obtenir traitées par le contrôle lui-même et peut ne pas bouillonner à l'événement TextInput.

Je cherche un moyen de convertir les Keys que je reçois dans PreviewKeyDown à chaîne réelle. Je regardais le etc InputManager, TextCompositionManager mais je ne trouve pas une façon où je donne la liste des clés et il revient avec une chaîne. TextCompositionManager ou quelque chose doit convertiront ces clés à une chaîne qui est ce qui est disponible dans TextInput.

Était-ce utile?

La solution

Voici l'événement que je me sers. Le KeyDown obtient les clés et le PreviewTextInput obtient le texte actuel. Donc, quelque part entre les touches sont se convertir en texte.

 public Window1()
            {
                InitializeComponent();
                TextCompositionManager.AddPreviewTextInputStartHandler(this, new TextCompositionEventHandler(Window_PreviewTextInput));
                this.AddHandler(Window.KeyDownEvent, new System.Windows.Input.KeyEventHandler(Window_KeyDown), true);
            }

    private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
            }

    private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
            {
            }

Autres conseils

Key -> conversion de texte est beaucoup plus compliqué que vous le pensez, il n'y a en fait aucun moyen de tracer une simple touche à un seul caractère, car dans certaines langues et certains cas, vous avez besoin de plusieurs séquences de touches pour composer un seul caractère

Puisque vous êtes intéressé par l'entrée d'un scanner de code-barres (que je suppose ne génère un petit sous-ensemble de ce que les fenêtres peuvent gérer, peut-être seulement ASCII peut-être même moins), vous pouvez construire la table de conversion vous-même et le code dur dans votre programme - il est beaucoup plus facile que de gérer toutes les folies que la manipulation de texte de Windows fait (pour le plaisir, la recherche « des touches mortes »).

Ok, volé ce poste.

[DllImport("user32.dll")]
static extern short VkKeyScan(char ch);

static public Key ResolveKey(char charToResolve)
{    
    return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top