Hi all,
I'm trying to use windows raw input to get a IC card reader input, the IC card reader is kown by windows as a HID keyboard.
as described in the post:
https://forum.lazarus.freepascal.org/index.php/topic,34797.msg228966.html#msg228966Firstly, I overide form.InitializeWnd, in which to register the raw device.
Then I add the WM_INPUT message handler to my form, but the handler never executed.
At last I override the WndProc of my form,but still no WM_INPUT comes.
Can anyone tell me how to do?
Thanks in advance.
Bellow is some of my code:
----------------------------
procedure registerHIDDevice(targetHandle: HWND);
var
Rid: array[0..0] of RAWINPUTDEVICE;
begin
with Rid[0] do
begin
usUsagePage := $01;
usUsage := $06;
dwFlags := RIDEV_NOLEGACY or RIDEV_INPUTSINK; // adds HID keyboard and also ignores legacy keyboard messages
hwndTarget := targetHandle;
end;
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) = FALSE) then
raise Exception.Create('Failed to register');
end;
procedure TfmMain.InitializeWnd; override;
begin
inherited InitializeWnd;
registerHIDDevice(Self.Handle);
end;
procedure TfmMain.getHIDInput(var msg: TMessage);
{
https://docs.microsoft.com/zh-cn/windows/desktop/inputdev/using-raw-input}
var
dwSize: UINT;
lpb: LPBYTE;
raw: PRAWINPUT;
begin
GetRawInputData(HRAWINPUT(msg.lParam), RID_INPUT, nil, @dwSize,
sizeof(RAWINPUTHEADER));
GetMem(lpb, dwSize);
if (lpb = nil) then Exit;
if (GetRawInputData(HRAWINPUT(msg.lParam), RID_INPUT, lpb, @dwSize,
sizeof(RAWINPUTHEADER)) <> dwSize ) then
begin
ShowMessage('Bad data size');
Freemem(lpb);
Exit;
end;
raw := PRAWINPUT(lpb);
if (raw^.header.dwType = RIM_TYPEKEYBOARD) then
begin
ShowMessage(Format('Kbd:'
+ '\n\tmake=%04x'
+ '\n\tFlags:%04x'
+ '\n\tReserved:%04x'
+ '\n\tExtraInformation:%08x'
+ '\n\tmsg=%04x'
+ '\n\tVK=%04x',
[
raw^.data.keyboard.MakeCode,
raw^.data.keyboard.Flags,
raw^.data.keyboard.Reserved,
raw^.Data.keyboard.ExtraInformation,
raw^.data.keyboard.Message,
raw^.data.keyboard.VKey
])
);
end;
DefRawInputProc(@lpb, 1, sizeof(RAWINPUTHEADER));
Freemem(lpb);
end;
procedure TfmMain.WndProc(var TheMessage: TLMessage); override;
begin
if TheMessage.msg = WM_INPUT then
getHIDInput(TheMessage);
inherited WndProc(TheMessage);
end;