C# USB二维码扫描器中文读取处理难题

doshf 2017-07-21 10:22:15
这几天要开发一个程序,用USB二维码扫描器读取中文二文码。基本思路是用虚拟键盘的方式处理,但处理后发现,中文内容全部丢失。谁处理过此类问题。
代码如下
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{

barCode.IsValid = false;
bool notChar = false;
if (nCode == 0)
{
EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));

if (wParam == 0x100) //WM_KEYDOWN = 0x100
{
barCode.VirtKey = msg.message & 0xff; //虚拟码
barCode.ScanCode = msg.paramL & 0xff; //扫描码

StringBuilder strKeyName = new StringBuilder(255);

if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) > 0)
{
barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });

}
else
{
barCode.KeyName = "";
}

byte[] kbArray = new byte[256];
uint uKey = 0;
GetKeyboardState(kbArray);// 取得的按键状态中文全部丢失!!!

if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0))
{
barCode.AscII = uKey;
//Console.WriteLine(uKey);
barCode.Chr = Convert.ToChar(uKey);
}
else
{
notChar = true; //转到ascii字符失败,这不是一个正常字符,要去掉
}


if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 30) //30ms可以过滤掉连续按住一个键时的情况
{
if (notChar == false)
strBarCode = barCode.Chr.ToString();
else
strBarCode = "";
barCode.IsValid = false;
}
else
{
if (strBarCode.Length >= 5)
{
barCode.IsValid = true; //isValid为true表明这是个条码
}
if (notChar == false)
{
strBarCode += barCode.Chr.ToString();
}
barCode.BarCode = strBarCode;
}

barCode.Time = DateTime.Now;
if (BarCodeEvent != null && barCode.IsValid) BarCodeEvent(barCode); //触发事件

}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
...全文
834 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2019-09-19
  • 打赏
  • 举报
回复
https://blog.csdn.net/superwfei/article/details/101005215
XBodhi. 2019-09-19
  • 打赏
  • 举报
回复
你那个设备没有 接口或是 SDK吗。如果你能用 USB 读取到二进制数据可以用 c# 版本的 二维码解析库 解析即可。
  • 打赏
  • 举报
回复
扫码器内部有接口,从打开闪光灯到自动拍照都有,如果你要获取识别后的数据请打开它自有的扫码驱动程序(exe部分),监视剪贴板即可。
尚节 2017-12-05
  • 打赏
  • 举报
回复
楼主解决这个问题了吗?
  • 打赏
  • 举报
回复
如果我让人编程,我就知道,这个人坑我的经费了。我让他写一个简单程序,他来给我 hook 底层,干什么?仅仅因为他想实现一个叫做 BarCodeEvent 的方法就 hook 底层?那还是别用这样的开发者。
  • 打赏
  • 举报
回复
按照设备的厂家的例子编程设计,正常地(不需要编程地)去处理应用程序中的按键事件,不要低级的地方浪费时间。根本不需要做任何东西。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧