某个项目 使用到了ScanerHook 扫码
扫码时会把条码(10)识别成 9100 或者 (!)) 由于数字键使用shift 切换 导致的问题
PS:特定条件还未知,只知道在winxp环境下 原代码没用问题 目前的系统是win11 条码枪型号是 得力 14952 可能和条码枪有关
贴ScanerHook部分代码
public void Add(EventMsg msg)
{
#region 记录按键信息
// 首次按下按键
if (_keys.Count == 0)
{
_keys.Add(new List<EventMsg>());
_keys[0].Add(msg);
_result.Add(string.Empty);
}
// 未释放其他按键时按下按键
else if (_keydown.Count > 0)
{
_keys[_keys.Count - 1].Add(msg);
}
// 单位时间内按下按键
else if (((TimeSpan)(DateTime.Now - _last)).TotalMilliseconds < ts)
{
_keys[_keys.Count - 1].Add(msg);
}
// 从新记录输入内容
else
{
_keys.Add(new List<EventMsg>());
_keys[_keys.Count - 1].Add(msg);
_result.Add(string.Empty);
}
#endregion
_last = DateTime.Now;
#region 获取键盘状态
// 记录正在按下的按键
if (msg.paramH == 0 && !_keydown.Contains(msg.message))
{
_keydown.Add(msg.message);
}
// 清除已松开的按键
if (msg.paramH > 0 && _keydown.Contains(msg.message))
{
if (isShift)
{
_keydown.RemoveAll(x => x == 160);
}
_keydown.Remove(msg.message);
}
#endregion
#region 计算按键信息
int v = msg.message & 0xff;
int c = msg.paramL & 0xff;
StringBuilder strKeyName = new StringBuilder(500);
if (GetKeyNameText(c * 65536, strKeyName, 255) > 0)
{
_key = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
GetKeyboardState(_state);
if (_key.Length == 1 && msg.paramH == 0)// && msg.paramH == 0
{
// 根据键盘状态和shift缓存判断输出字符
_cur = ShiftChar(_key, isShift, _state).ToString();
_result[_result.Count - 1] += _cur;
}
else if (_key.ToLower().Contains("shift"))
{
if (!_keydown.Contains(160))
{
_keydown.Add(160);
}
}
// 备选
else
{
_cur = string.Empty;
}
}
#endregion
}
问题探究发现是 isShift 的状态并未获取到
在处理key时 是能发现_key 是shift字符的 但是_keydown中却并未包含160 所以添加代码 当发现shift按键时增加160
为了兼容 先判断下_keydown是否包含160
PS:160是左shift 161是右shift
else if (_key.ToLower().Contains(“shift”))
{
if (!_keydown.Contains(160))
{
_keydown.Add(160);
}
}
此时增加了shift键 由于没有取消 会导致条码都会经过shift转换
所以要在shift字符使用完后释放 所以 在松开按键的地方增加如下代码 清除shift内容 先判断下 isShift是shift组合按键才取消
if (isShift)
{
_keydown.RemoveAll(x => x == 160);
}
至此 条码能够正常识别
至于会不会存在其他问题 后续继续观察