C# ScanerHook 键盘钩子 特定条件下 扫码 shift 无法识别 问题处理

某个项目 使用到了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);
}

至此 条码能够正常识别
至于会不会存在其他问题 后续继续观察

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值