C#寫的程式,監聽掃碼槍掃二維碼,時而能行,時而不行。。
求來一位大神給解決一下。。。在線等,挺急的

積分只有這么多了。。
鉤子類,用于安裝和卸載鉤子
/// <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;
}
uj5u.com熱心網友回復:
求助大佬。。在線等uj5u.com熱心網友回復:
求助大佬。。在線等uj5u.com熱心網友回復:
人家設備“正常地”操作鍵盤,你弄個鉤子干什么?正常地處理鍵盤事件編程就可以了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/251260.html
標籤:C#
上一篇:vue 里面的ajax 請求函式無法獲取 vue 變數
下一篇:abp v6.0(ts)+.net core(3.0) 發布通知前端abp.notifications.received不進入
