USB 条形码扫描器输入在 FMX 项目中被忽略
USB barcode scanner inputs are ignored in FMX projects
我正在尝试将程序从 Delphi7 升级到 DelphiXE8。
程序中有一些TEdit字段。您可以通过键盘或 USB 扫描仪在该字段中输入数据。 USB 扫描仪模拟键盘并在所有其他程序中正常工作。 (Delphi7、Firefox、Editor 等中的相同程序......)
如果我在 Delphi XE8 中使用扫描仪,TEdit 字段无法获得正确的数据。如果我触发 KeyDown 事件,我会看到有许多键 16/17/18 进入,但 KeyChar 始终为 #0。
与 TMemo 相同的问题。
我只是尝试了一些不同的东西:
在 VCL 项目中,扫描器工作正常。
在 FMX 项目中,扫描器失败。
扫描仪是桦木BF-481BU/N。
有什么可以解决该问题的想法吗?
我的扫描仪有 Caps Lock 设置。
自动
Alt+小键盘
大写锁定关闭
大写锁定
使用 "Auto"、"Off"、"On" 扫描仪可以很好地使用 FMX。
使用 "Alt+Keypad" 时,FMX 中的扫描失败。
我尝试使用正常的 USB 扫描仪(Keyboard wedge),此代码工作正常。
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.
我在制作游戏时遇到了这个问题。似乎键码正在获取 "handled" 并在它到达表单之前设置为 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 源文件夹复制到您自己的私有源代码树中,并从那里构建它。然后你的应用程序将使用你放入的任何小补丁构建,但它比安装被黑的 design-time 包更简单。
一旦您拥有自己的私人 FMX 源,您就可以开始对其进行破解(您必须不时这样做)。
开始新项目时,您应该做的第一件事是将 FMX 源文件夹复制到您自己的私有源代码树中,然后从那里构建。
FMX 在成为一个全面的跨平台解决方案之前还有一段路要走,但它越来越近了,所以你偶尔会不得不弄乱它。使用类似的方法,我添加了 Android 笔支持,修复了一些 BLE 问题……您可能会遇到自己的问题。
我正在尝试将程序从 Delphi7 升级到 DelphiXE8。
程序中有一些TEdit字段。您可以通过键盘或 USB 扫描仪在该字段中输入数据。 USB 扫描仪模拟键盘并在所有其他程序中正常工作。 (Delphi7、Firefox、Editor 等中的相同程序......)
如果我在 Delphi XE8 中使用扫描仪,TEdit 字段无法获得正确的数据。如果我触发 KeyDown 事件,我会看到有许多键 16/17/18 进入,但 KeyChar 始终为 #0。
与 TMemo 相同的问题。
我只是尝试了一些不同的东西:
在 VCL 项目中,扫描器工作正常。 在 FMX 项目中,扫描器失败。
扫描仪是桦木BF-481BU/N。
有什么可以解决该问题的想法吗?
我的扫描仪有 Caps Lock 设置。
自动
Alt+小键盘
大写锁定关闭
大写锁定
使用 "Auto"、"Off"、"On" 扫描仪可以很好地使用 FMX。 使用 "Alt+Keypad" 时,FMX 中的扫描失败。
我尝试使用正常的 USB 扫描仪(Keyboard wedge),此代码工作正常。
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.
我在制作游戏时遇到了这个问题。似乎键码正在获取 "handled" 并在它到达表单之前设置为 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 源文件夹复制到您自己的私有源代码树中,并从那里构建它。然后你的应用程序将使用你放入的任何小补丁构建,但它比安装被黑的 design-time 包更简单。
一旦您拥有自己的私人 FMX 源,您就可以开始对其进行破解(您必须不时这样做)。
开始新项目时,您应该做的第一件事是将 FMX 源文件夹复制到您自己的私有源代码树中,然后从那里构建。
FMX 在成为一个全面的跨平台解决方案之前还有一段路要走,但它越来越近了,所以你偶尔会不得不弄乱它。使用类似的方法,我添加了 Android 笔支持,修复了一些 BLE 问题……您可能会遇到自己的问题。