[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:
procedure HandleWM_INPUTMessage (var Msg : TMessage); message WM_INPUT;
procedure :
Code:
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à...