FMX项目中忽略USB条形码扫描仪输入

时间:2015-07-13 10:47:50

标签: delphi firemonkey barcode-scanner delphi-xe8

我正在尝试将程序从Delphi7升级到DelphiXE8。

在程序中有一些TEdit字段。您可以通过键盘或USB扫描仪在该字段中输入数据。 USB扫描仪模拟键盘,可在所有其他程序中正常工作。 (Delphi7中的相同程序,Firefox,编辑器等......)

如果我在Delphi XE8中使用扫描仪,TEdit字段无法获得正确的数据。如果我触发KeyDown事件,我会看到有许多Key 16/17/18进入,但KeyChar总是#0。

与TMemo相同的问题。

我只是尝试了不同的东西:

在VCL项目中,扫描仪工作正常。 在FMX项目中,扫描仪失败。

扫描仪是Birch BF-481BU / N.

有什么想法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

我的扫描仪有Caps Lock设置。

自动
Alt +键盘
大写锁定关闭 大写锁定开

使用“自动”,“关闭”,“开启”扫描仪可以正常使用FMX。 使用“Alt +键盘”,FMX中的扫描失败。

答案 1 :(得分:0)

我尝试使用普通USB扫描仪(键盘楔),此代码可以正常工作。

procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin

 if KeyChar = #13 then ShowMessage('Your code is ' + Edit1.Text);

end;

Alt + Keypad is used to enter particular chars typing the ascii code.
As an example if you press ALT + 126 the result will be "~"
So probably you have to remove the Alt+Keypad settings on your scanner.

答案 2 :(得分:0)

我在游戏中遇到了这个问题。似乎关键代码正在处理"处理"并在它甚至到达表单之前设置为null。看起来他们只是在按下ALT或CTRL键时传递信息。

为了解决这个特殊问题,我在FMX.Platform.Win

中注释掉了一行
procedure CurrentChar(Msg: tagMsg; var Key: Word; var Ch: WideChar; var Shift: TShiftState);
begin
  Key := wParam;
  Ch := WideChar(Msg.wParam);
  Shift := KeyDataToShiftState(lParam);
  if (Ch >= ' ') then
  begin
    if ((Shift * [ssAlt, ssCtrl]) = [ssAlt, ssCtrl]) then
    begin
      // AltGr + Char (in German keyboard)
      Shift := Shift - [ssAlt, ssCtrl];
    end;
    //WHYYYY?!?!?!?!?!?!?
    //if (([ssAlt, ssCtrl, ssCommand] * Shift) = []) then
    //  Key := 0;
  end;
  if ((([ssAlt, ssCtrl, ssCommand] * Shift) <> []) or (Ch < ' ')) and (Key > 0) then
    Ch := #0;
end;

我首先做的是将FMX源文件夹复制到您自己的私有源树中并从那里构建它。然后你的应用程序将使用你添加的任何小补丁来构建,但它比安装被黑的设计时包更简单。

一旦你拥有了自己的私人FMX源,那么你可以开始攻击它(你将不时这样做)。

开始一个新项目时应该做的第一件事就是将FMX源文件夹复制到您自己的私有源树中并从那里构建。

FMX在它是一个全面的跨平台解决方案之前还有很长的路要走,但它越来越近了,所以你偶尔也要乱用它。使用类似的方法,我添加了Android笔支持,修复了一些BLE问题......你可能会遇到自己的问题。