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à...