110,561
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 开始监听
/// </summary>
/// <returns></returns>
public bool Start()
{
_qrCode.Clear();
if (_hookProc == null || _hookHandle == IntPtr.Zero)
_hookProc = KeyboardHookProc;
//获取指针
IntPtr inpp = Kernel32Library.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
//添加Hook
_hookHandle = User32Library.SetWindowsHookEx((int)HookType.WH_KEYBOARD_LL, _hookProc, inpp, 0);
Runing = true;
return true;
}
/// <summary>
/// 停止监听
/// </summary>
/// <returns></returns>
public bool Stop()
{
bool unhookSuccess = false;
if (_hookHandle != null || _hookHandle != IntPtr.Zero)
{
unhookSuccess = User32Library.UnhookWindowsHookEx(_hookHandle);
_hookHandle = IntPtr.Zero;
Runing = false;
}
return unhookSuccess;
}
/// <summary>
/// 钩子回调函数
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode == 0)
{
KeyboardMessage msg = (KeyboardMessage)Marshal.PtrToStructure(lParam, typeof(KeyboardMessage));
_qrCode.Add(msg);
LogUtility.Info("Msg解析值:" + msg.vkCode + " 二维码扫码结果:" + _qrCode.Result);
//vkCode=13表示回车
if (msg.vkCode == 13 && msg.paramH == 0 && !string.IsNullOrEmpty(_qrCode.Result))
{
QRCodeProcess(_qrCode.Result);
}
}
return User32Library.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
}
/// <summary>
/// 增加键盘信息
/// </summary>
/// <param name="msg"></param>
public void Add(KeyboardMessage msg)
{
#region 记录按键信息
// 首次按下按键
if (_keys.Count == 0)
{
_keys = new List<KeyboardMessage>();
_keys.Add(msg);
_result = string.Empty;
}
// 未释放其他按键时按下按键
else if (_keydown.Count > 0)
{
_keys.Add(msg);
}
// 单位时间内按下按键
else if (((TimeSpan)(DateTime.Now - _last)).TotalMilliseconds < Interval)
{
_keys.Add(msg);
}
// 从新记录输入内容
else
{
_keys = new List<KeyboardMessage>();
_keys.Add(msg);
_result = string.Empty;
}
#endregion
_last = DateTime.Now;
#region 获取键盘状态
// 记录正在按下的按键
if (msg.paramH == 0 && !_keydown.Contains(msg.vkCode))
{
_keydown.Add(msg.vkCode);
}
// 清除已松开的按键
if (msg.paramH > 0 && _keydown.Contains(msg.vkCode))
{
_keydown.Remove(msg.vkCode);
}
#endregion
#region 计算按键信息
int v = msg.vkCode & 0xff;
int c = msg.paramL & 0xff;
StringBuilder strKeyName = new StringBuilder(500);
if (User32Library.GetKeyNameText(c * 65536, strKeyName, 255) > 0)
{
_currentKey = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
User32Library.GetKeyboardState(_state);
if (_currentKey.Length == 1 && msg.paramH == 0)
{
// 根据键盘状态和shift缓存判断输出字符
_cur = ShiftChar(_currentKey, isShift, _state).ToString();
_result += _cur;
}
}
#endregion
}
/// <summary>
///
/// </summary>
/// <param name="k"></param>
/// <param name="isShiftDown"></param>
/// <param name="state"></param>
/// <returns></returns>
private char ShiftChar(string k, bool isShiftDown, byte[] state)
{
bool capslock = state[0x14] == 1;
bool numlock = state[0x90] == 1;
bool scrolllock = state[0x91] == 1;
bool shiftdown = state[0xa0] == 1;
char chr = (capslock ? k.ToUpper() : k.ToLower()).ToCharArray()[0];
if (isShiftDown)
{
if (chr >= 'a' && chr <= 'z')
{
chr = (char)((int)chr - 32);
}
else if (chr >= 'A' && chr <= 'Z')
{
if (chr == 'Z')
{
string s = "";
}
chr = (char)((int)chr + 32);
}
else
{
string s = "`1234567890-=[];',./";
string u = "~!@#$%^&*()_+{}:\"<>?";
if (s.IndexOf(chr) >= 0)
{
return (u.ToCharArray())[s.IndexOf(chr)];
}
}
}
return chr;
}
private int iStep = 0;
private int n;
public string strRet = "";
protected override void WndProc(ref Message m)//监视Windows消息
{
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int WM_CHAR = 0x0102;
switch (m.Msg)
{
case WM_KEYDOWN:
{
//begin --------------------------------------
iStep = 1;
}
break;
case WM_CHAR:
{
if(iStep==1){
iStep = 2;
n = m.WParam.ToInt32();
System.Diagnostics.Debug.Write(n+" / "+Convert.ToChar(n)+"\n");
strRet = strRet + Convert.ToChar(n).ToString();
}
else { iStep = 0; }
}break;
case WM_KEYUP:
{
if (iStep == 2)
{
iStep = 3;
if (m.WParam.ToInt32() == 13)
{
this.lb.Text = "当前条码为:" + strRet;
this.listBox1.Items.Add(strRet);
iStep = 0;
strRet = "";
}
}
else { iStep = 0; }
}break;
}
base.WndProc(ref m);
}