6
votes

Événement de clé Concat (clés) à une chaîne C # (WPF)

J'ai un lecteur de carte magnétique qui utilise l'entrée du clavier pour envoyer des données. J'utilise un événement de clé où je reçois cet objet (c # wpf): xxx pré>

Je veux prendre les clés que je reçois et en font une chaîne. J'ai essayé de concessurer e.key.tostring () code>, mais cela ne fonctionne pas. Mon entrée a beaucoup de chiffres et de signes (tels que;? = Etc.), et la chose _key.tostring () ne fonctionne pas (cela me donne D3 pour un numéro, et Shift ou Ctrl + une autre clé pour le SIGNES) >

 public enum MapType : uint
    {
        MAPVK_VK_TO_VSC = 0x0,
        MAPVK_VSC_TO_VK = 0x1,
        MAPVK_VK_TO_CHAR = 0x2,
        MAPVK_VSC_TO_VK_EX = 0x3,
    }
    [DllImport("user32.dll")]
    public static extern bool GetKeyboardState(byte[] lpKeyState);
    [DllImport("user32.dll")]
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
    [DllImport("user32.dll")]
    public static extern int ToUnicode(
     uint wVirtKey,
     uint wScanCode,
     byte[] lpKeyState,
     [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
        StringBuilder pwszBuff,
     int cchBuff,
     uint wFlags);

    public static char GetCharFromKey(Key key)
    {
        char ch = ' ';

        int virtualKey = KeyInterop.VirtualKeyFromKey(key);
        byte[] keyboardState = new byte[256];
        GetKeyboardState(keyboardState);

        uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
        StringBuilder stringBuilder = new StringBuilder(2);

        int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
        switch (result)
        {
            case -1:
                break;
            case 0:
                break;
            case 1:
                {
                    ch = stringBuilder[0];
                    break;
                }
            default:
                {
                    ch = stringBuilder[0];
                    break;
                }
        }
        return ch;
    }


4 commentaires

Je suppose au moment où vous utilisez votre lecteur de carte comme émulateur de clavier. At-il un SDK que vous pouvez utiliser? Habituellement, de tels dispositifs sont livrés avec pilotes et contrôles / API que vous pouvez utiliser dans vos applications.


C'est juste une entrée de clavier. Le fait qu'il s'agisse d'un lecteur de carte ou d'une jumble Mumble que j'ai frappé sur le clavier ne comporte pas d'importance pour cette affaire.


Y a-t-il d'autres événements que vous pourriez utiliser?


Aperviewkedowndown iAved ... KeyPress Peut-être ... Tout événement que le clavier va déclencher est ok


3 Réponses :


-1
votes

Essayez de la jeter:

char c = (char)e.KeyCode;


1 commentaires

Je n'ai pas d'E.KeyCode, j'utilise WPF.



-2
votes
string keylog=""; // do global declaration
//use the bellow line in event handler
keylog= keylog +  e.Key.ToString();

1 commentaires

J'ai écrit que j'ai essayé cela, je reçois la question Ctrl Shift Ctrl, etc. Lisez mon post



0
votes

OK, je fais un certain nombre d'hypothèses ici:

  1. La valeur est saisie dans une zone de texte.
  2. Le lecteur de carte utilise la touche Entrée lorsqu'il a entré toutes les valeurs.

    Si ce qui précède est vrai, vous pouvez le faire: xxx


5 commentaires

Ce n'est pas une zone de texte, il s'agit d'un gestionnaire d'événements à tous les événements de clé dans une fenêtre et n'utilise pas la touche Entrée.


Je pense que vous devez trouver une solution différente, le WPF Keeventargs ne fournit pas la valeur clé comme la version WinForms.


Je sais que, donc ma question. Il doit y avoir un moyen de faire fonctionner cela dans WPF


Est-ce que cela aide Nom de Christoph.ruegg.nom / Blog / 2007/5/8 / ... ?


Il a l'air bien, mais il reçoit un élément pour ajouter le gestionnaire à. Je souhaite le gestionnaire de ma part de solutin comme suit: événementManager.registerClasshandler (typeof (fenêtre), fenêtre.KeyDownEvent, nouveau KeyEventHandler (KeyPress));