IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[WPF] Lecture de carte RFID, Clavier virtuel


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut [WPF] Lecture de carte RFID, Clavier virtuel
    Bonjour à tous,

    J'ai besoin de capturer le code d'une carte RFID, grâce à un lecteur qui dispose d'une fonction clavier "virtuel" si je peux l'appeler ainsi.

    Le logiciel, installer sur des bornes, utilise déjà un système qui communique en PORT COM. Les lectures qui servent d'identification, devra être parfaitement identique entre les 2 système, les utilisateurs pouvant utiliser alternativement les anciens lecteur ou ce nouveau.

    Je ne connaissais pas ce système de clavier "virtuel", et l'ancien développeur du projet à uniquement codé l'acquisition des touches, mais cela ne fonctionne pas bien.

    Sur la vue principal:

    Sur l'évènement Loaded:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using RawInputProcessor;
    using System.Windows.Input;
    using System.Windows.Navigation;
     
    private void NavigationWindow_Loaded(object sender, RoutedEventArgs e)
    {
        _rawInput = new RawPresentationInput(this, RawInputCaptureMode.Foreground);
        _rawInput.KeyPressed += STATIC_FUNCTION.OnKeyPressed;
    }
    Dans STATIC_FUNCTION j'avais uniquement cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void OnKeyPressed(object sender, RawInputEventArgs e)
            {
                if (e.Device.Name.Contains("HID#VID_076B&PID_5428"))
                {
     
                    if (e.Key.String() != "LeftShift")
                    {
                          inData += e.Key.String();
                          LastRecpBadge2 = DateTime.Now;
                    }
                }
            }

    Et ensuite il regardait uniquement si InData contenait quelque chose.
    Bon ce n'est qu'une ébauche.

    Le lecteur semble assez complet, il est possible, entre autre, d'ajouter des caractères de début et de fin où, comme je pense utiliser, un caractère envoyé lorsque la carte n'est plus sur le lecteur.

    Le code de ma carte de test est A39D2BBD, ainsi j'ai ajouté "&" en début et "#" lorsque la carte est retiré du lecteur, et avec le bloc note j'ai parfaitement &A39D2BBD#. Mais cela se complique dans le logiciel.

    1) Déjà il regarde le nom du périphérique. (e.Device.Name.Contains("HID#VID_076B&PID_5428")) c'est bien le mien, je suppose que chaque périphérique aura peut être un nom diffèrent, ou une partie commune permettant d'identifier que c'est bien le lecteur de carte, et pas un simple clavier.

    2) La simple conversion de e.Key.ToString(), ne donne pas la bonne valeur non plus.
    Le & est représenté par D1
    Le # par D3.

    J'ai trouvé une fonction qui permet de me donner la bonne valeur:


    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
    56
     
          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 int ToUnicode(
                uint wVirtKey,
                uint wScanCode,
                byte[] lpKeyState,
                [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)]
                StringBuilder pwszBuff,
                int cchBuff,
                uint wFlags);
     
            [DllImport("user32.dll")]
            public static extern bool GetKeyboardState(byte[] lpKeyState);
     
            [DllImport("user32.dll")]
            public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
     
            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;
            }
    Avec cela j'ai bien mes caractères & et #, mais pour le reste ce n'est pas top non plus.

    Voila du coup ce que je me suit fait:
    J'ai 2 buffers histoire de voir la différence entre le retour de GetCharFromKey et e.Key.ToString();

    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
     
            static string BufferBadgeString = "";
            static string BufChar = "";
            static bool EnterCard = false;
     
     
            public static void OnKeyPressed(object sender, RawInputEventArgs e)
            {
                if (e.Device.Name.Contains("HID#VID_076B&PID_5428"))
                {
                    System.Windows.Input.Key mKey = e.Key;
     
                    char mK = GetCharFromKey(mKey);
     
                    if (mK == '#')
                    {
                        //Fin de trame trouvé
                        //point d'arrêt ici
                        EnterCard = false;
                        inData = BufChar ;
                    }
                    else if (mK == '&')
                    {
                        //Début de trame
                        EnterCard = true;
                    }
                    else if (EnterCard)
                    {     
                        BufChar += mK;
                        if (mKey.ToString() != "LeftShift")
                            BufferBadgeString += mKey.ToString();
                    }
                }
            }
    Au point d'arrêt j'ai sa:
    BufChar = " A a 3 \" 9 ç D d 2 é B b B b D d "
    BufferBadgeString ="AAD3D3D9D9DDD2D2BBBBDDLeftCtrlLeftAlt"

    L'un comme l'autre ce n'est pas terrible.

    Filtrer LeftShift semble convenir car sinon il se retrouve entre chaque caractère de BufferBadgeString.
    Si je filtre LeftShift avant, BuffChar = "Aa3\"9çDd2éBbBbDd "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (mKey.ToString() == "LeftShift")
                    {
                        return;
                    }
    La capture ne semble pas bonne. Mettre des point d'arrêt pendant la boucle est compliqué, car du coup cela écrit dans Visual Studio directement.

    Concernant le lecteur ont défini aussi qu'il est en clavier Français, sur un environnement Windows. C'est un lecteur HID OMNIKEY 5427.

    Avez vous une solution qui me permettrait d'avoir ce que le Bloc note reçois parfaitement.

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    tu as du code dispo sur le site de ton lecteur
    => https://www3.hidglobal.com/drivers/14983

    d'autres ressources ici (il faut s'enregistrer pour y avoir accès) https://www3.hidglobal.com/developer...veloper-center

    Au point d'arrêt j'ai sa:
    BufChar = " A a 3 \" 9 ç D d 2 é B b B b D d "
    BufferBadgeString ="AAD3D3D9D9DDD2D2BBBBDDLeftCtrlLeftAlt"
    Tu remarquera que si tu prends un caractère sur 2de BufChar, tu retrouves bien le code de ta carte test A39D2BBD (en supprimant aussi les espaces qu'il semble y avoir)

  3. #3
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par umfred Voir le message
    tu as du code dispo sur le site de ton lecteur
    => https://www3.hidglobal.com/drivers/14983

    d'autres ressources ici (il faut s'enregistrer pour y avoir accès) https://www3.hidglobal.com/developer...veloper-center
    Bonjour,

    Alors là chapeau. Avant de demandé de l'aide sur le mode Clavier, j'avais demandé à HID, et ils m'ont répondu que le kit développeur était payant et me disait donc d'utiliser le mode clavier, mais j'avais demander aussi s'il avait des codes exemple et m'avais renvoyer sur le kit dév...
    Le code que vous m'avez trouvé et juste parfait pourtant, d'ailleurs l'exemple C# (WPF, .NetFramwork 3.5, donc nickel pour moi) se connecte en mode CCID et non Clavier


    Citation Envoyé par umfred Voir le message
    Tu remarquera que si tu prends un caractère sur 2de BufChar, tu retrouves bien le code de ta carte test A39D2BBD (en supprimant aussi les espaces qu'il semble y avoir)
    Parfaitement d'accord et les espaces étant le résultat de OnKeyPressed ("LeftShift");, mais je trouvais quand même pas très propre la solution de filtrer tout sa.


    Je devrais donc m'en sortir avec ce code exemple.

    Merci encore.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Tu es sûr que l'accès au kit est payant, je n'ai pas essayé en créant de compte pour voir ce qui était accessible ou pas.

    Mais si le code trouvé sur la page des drivers peut t'aider, c'est ça de gagner

  5. #5
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par umfred Voir le message
    Tu es sûr que l'accès au kit est payant, je n'ai pas essayé en créant de compte pour voir ce qui était accessible ou pas.

    Mais si le code trouvé sur la page des drivers peut t'aider, c'est ça de gagner

    Bonjour, c'est le contact HID que j'ai eue (email trouvé sur leur site) qui m'a répondu cela, mais comme souvent je pense qu'il n'a pas compris mon besoin, le kit semble contenir des cartes de test des cartes rfid, des PCB peut être la carte seul à intégrer dans nos systèmes. alors que j'avais juste besoin des codes exemple.

    J'ai réussi à l'adapter pour mon fonctionnement. J'ai créé une classe qui gère ce lecteur de carte, j'ai pas besoin d'une interface graphique, j'ai juste besoin d'avoir le numéro de la carte quand elle est présente par un évènement, c'est parfait.

    Il me restera à adapter le résultat pour que se soit identique aux anciens systèmes, apparemment le sens de lecture n'est pas le même et autre subtilité, mais je n'ai plus de lecteur pour le tester RRrrrr.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture/écriture carte RFID mifare console via libnfc
    Par jym92 dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 01/04/2022, 23h09
  2. lecture carte rfid avec lecteur nfc
    Par fannyE dans le forum Windev Mobile
    Réponses: 1
    Dernier message: 31/12/2018, 05h19
  3. Lecture depuis un lecteur carte RFID
    Par dimainfo dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 24/03/2010, 09h58
  4. Clavier virtuel
    Par ouquoi dans le forum MFC
    Réponses: 2
    Dernier message: 22/02/2006, 11h33
  5. Lecture de carte SD impossible
    Par Bouki dans le forum Périphériques
    Réponses: 6
    Dernier message: 18/08/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo