Exemple #1
0
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));

            codes.Add(msg);
            if (ScanerEvent != null && msg.message == 13 && msg.paramH > 0 && !string.IsNullOrEmpty(codes.Result))
            {
                ScanerEvent(codes);
            }
            return(CallNextHookEx(hKeyboardHook, nCode, wParam, lParam));
        }
Exemple #2
0
        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))
            {
                _keydown.Remove(msg.message);
            }
            #endregion
            #region 计算按键信息

            int           v          = msg.message & 0xff;
            int           c          = msg.paramL & 0xff;
            StringBuilder strKeyName = new StringBuilder(500);
            if (ScanerHook.GetKeyNameText(c * 65536, strKeyName, 255) > 0)
            {
                _key = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
                ScanerHook.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
                {
                    _cur = string.Empty;
                }
            }
            #endregion
        }