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

Langage Delphi Discussion :

[D2007] message WM_INPUT keyboard


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut [D2007] message WM_INPUT keyboard
    Bonjour,

    je suis en train de développer une application prenant comme source de sécurité un lecteur de clé (identifié comme keyboard, sous-type HID).
    J'utilise pour cela le rawinput (ou du moins j'apprend à l'utiliser), ce qui me permet de différencier les différents claviers.

    J'intercepte donc les messages windows par WM_INPUT

    Mon problème, qui peut sembler bénin, est que j'ai beau identifier mon périphérique envoyant le message, je ne sais pas du tout comment lire ce qui a été saisi (le texte en lui-même donc !!)

    voici un bout du code utilisé :

    déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure HandleWM_INPUTMessage (var Msg : TMessage); message WM_INPUT;
    procedure :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    procedure TFTestRawInput.HandleWM_INPUTMessage (var Msg : TMessage);
    var
      i,l: Integer;
      RI: PRAWINPUT;
      dwSize: UINT;
      lpb: PBYTE;
      DataSize: DWORD;
      HID_DATA:array [0..15] of DWORD;
      P:PByte;
      tmpX,tmpY: Integer;
      pData: Pointer;
      devName: PChar;
      deviceName : string;
      NameSize: Integer;
      DevInfo: TRidDeviceInfo;
      KeyboardInfo: TRidDeviceInfoKeyboard;
      RIKey: PRAWINPUT;
      strOut: String;
      strListName : TStringList;
    begin
      GetRawInputData(HRAWINPUT(Msg.LParam), RID_INPUT, nil, dwSize, SizeOf(TRAWINPUTHEADER));
     
      if dwSize = 0 then Exit;
     
      DataSize := SizeOf(BYTE) * dwSize;
     
      GetMem(lpb,DataSize);
      try
        GetRawInputData(HRAWINPUT(Msg.LParam), RID_INPUT, lpb, dwSize, SizeOf(TRAWINPUTHEADER));
        RI := PRAWINPUT(lpb);
     
        // clavier
        if RI.header.dwType = RIM_TYPEKEYBOARD then
        begin
          try
            // ne réagir que sur un KEYDOWN
            if (RI.keyboard.Message = WM_KEYDOWN) then
              begin
                GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, nil, dwSize);
                GetMem(devName,dwSize);
                GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, Pointer(devName), dwSize);
                deviceName := copy(StrPas(devName), 5);
                strListName := TStringList.Create;
                Split('#', deviceName, strListName);
     
                if strListName[2] = "#le protocole de mon périphérique#" then
                begin
    ////////    saisie := ''; // j'aimerais enregistrer ici la saisie de cet évènement !!
                  Msg.Result := 0;
                  if RI.keyboard.VKey = 13 then
                  begin
                    Application.ProcessMessages;
                    saisie := '';
                  end;
                end else
                begin
                  Msg.Result := 1232;
                end;
     
              end;
            except on e: exception do
              showmessage('erreur : '+#13+e.message);
            end;
          end;
      finally
        FreeMem(lpb,DataSize);
        FreeMem(devName,dwSize);
      end;
    end;
    Merci d'avance pour toute information qui me permettrait d'enfin avancer un peu là-dedans ^^

    PS : désolé pour la liste de variables, je passe mon temps à changer de code et je n'ai pas vraiment fais le ménage là...

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    hum... bon c'est pas clair ^^

    en gros je cherche à capter le message qui est contenu dans l'évènement WM_INPUT... si bien sûr il est effectivement contenu dedans...

    donc en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure HandleWM_INPUTMessage (var Msg : TMessage); message WM_INPUT;
    est-il possible de récupérer la valeur de la touche enfoncée du clavier dans Msg : TMessage ?

    autre possibilité (je n'y connais rien dans ce domaine...) je peux récupérer une valeur numérique de la touche : RI.keyboard.VKey, genre 13 pour la touche entrée (qui correspond à la constante système WM_KEYDOWN), peut-être qu'il existe un tableau de correspondance universel ou une fonction windows permettant de traduire ce nombre...

    non ?

    Edit : bon en fait il me suffisait de faire un CHR sur RI.keyboard.VKey... pffff

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Bon en fait, je butte sur l'étape suivante...

    Mon identification se fait bien, je sais quand on insère la clé de sécurité ou quand on l'extrait, le problème est que l'identifiant envoyé par mon périphérique, considéré comme un clavier, s'inscrit dans le champs actif lors de son insertion...

    n'y a-t-il pas un moyen, toujours par l'événement WM_INPUT, en plus d'intercepter le message, de l'empêcher d'aller plus loin ?

    en gros si j'identifie mon périphérique, je dois bloquer tout ses messages.

    modifier msg.Result apparemment ne bloque pas le message... une idée, une info ?

  4. #4
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Bonjour,

    As-tu essayé de tuer le message lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure HandleWM_INPUTMessage (var Msg : TMessage);
    begin
      try
        ......
        .....
      finally
        Msg.Msg := 0;
      end;
    end;
    a+

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Tout d'abord merci de ta réponse ^^

    Apparemment, l'objet ne doit être accessible qu'en lecture seule... enfin je n'ai pas d'erreur en faisant Msg.Msg := 0, mais mon message passe sans modifications... il existe peut être un moyen de valider les modifications, d'affecter grâce au handle par une autre procédure les nouvelle caractéristiques du message directement dans la pile...

    encore merci ^^

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 939
    Billets dans le blog
    6
    Par défaut
    et msg:=nil ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/07/2007, 09h49
  2. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. A lire impérativement avant de poster un message
    Par ok.Idriss dans le forum Demandes
    Réponses: 0
    Dernier message: 01/05/2002, 18h57

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