【问题标题】:USB barcode scanner inputs are ignored in FMX projectsUSB 条形码扫描仪输入在 FMX 项目中被忽略
【发布时间】:2023-12-21 22:37:02
【问题描述】:

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

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

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

TMemo 也有同样的问题。

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

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

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

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

【问题讨论】:

  • 嗨!您在为 Windows 开发吗?
  • 您的扫描仪是否支持按键输入之间的延迟设置?您是否尝试过增加延迟?
  • 到目前为止,它只适用于windows。但将来我们不会将其移植到其他设备上。
  • 它将间隔设置为 99ms.... 相同的结果。
  • 在 Delphi7 和 XE8-VCL 中有一条 Windows 消息 WM_CHAR 会导致 OnKeyPressed 事件。 USB-Scanner 发送这个 WM_Char 作为实际密钥。但是 FMX.Platform.Win 第 2328 行永远不会在 FMX 项目中被触发。

标签: delphi firemonkey barcode-scanner delphi-xe8


【解决方案1】:

我的扫描仪有 Caps Lock 设置。

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

使用“Auto”、“Off”、“On”,扫描仪可以与 FMX 一起正常工作。 使用“Alt+Keypad”在 FMX 中扫描失败。

【讨论】:

    【解决方案2】:

    我尝试使用正常的 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.
    

    【讨论】:

      【解决方案3】:

      我正在构建的游戏遇到了这个问题。似乎键码在到达表单之前就被“处理”并设置为空。看起来他们只是在按下 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 问题……您可能会遇到自己的事情。

      【讨论】: