问题描述
我正在.NET CORE 3.1平台上构建应用程序,计划在RaspBerry Pi 4上运行它。但是当应用程序处于隐身模式时,从键盘读取数据时出现错误。 (我实际上是从QRcode机读取数据的)。 我使用钩子,这是我的钩子函数:
class Y2KeyboardHook
{
public delegate void KeyEventHandler(object sender,KeyEventArgs e);
#region Win32 API Functions and Constants
[DllImport("user32.dll",SetLastError = true)]
private static extern IntPtr SetwindowsHookEx(int idHook,KeyboardHookDelegate lpfn,IntPtr hMod,int dwThreadId);
[DllImport("user32.dll",SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll",SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk,int nCode,IntPtr wParam,IntPtr lParam);
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x101;
#endregion
private KeyboardHookDelegate _hookProc;
private IntPtr _hookHandle = IntPtr.Zero;
public delegate IntPtr KeyboardHookDelegate(int nCode,IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public struct KeyboardHookStruct
{
public int VirtualKeyCode;
public int ScanCode;
public int Flags;
public int Time;
public int ExtraInfo;
}
#region Keyboard Events
public event EventHandler<KeyEventArgs> KeyDown;
public event EventHandler <KeyEventArgs> KeyUp;
#endregion
// destructor
~Y2KeyboardHook()
{
Uninstall();
}
public void Install()
{
_hookProc = KeyboardHookProc;
_hookHandle = SetupHook(_hookProc);
if (_hookHandle == IntPtr.Zero)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
private IntPtr SetupHook(KeyboardHookDelegate hookProc)
{
IntPtr hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
return SetwindowsHookEx(WH_KEYBOARD_LL,hookProc,hInstance,0);
}
private IntPtr KeyboardHookProc(int nCode,IntPtr lParam)
{
if (nCode >= 0)
{
KeyboardHookStruct kbStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyboardHookStruct));
if (wParam == (IntPtr)WM_KEYDOWN)
{
KeyDown?.Invoke(this,new KeyEventArgs((Keys)kbStruct.VirtualKeyCode));
}
else if (wParam == (IntPtr)WM_KEYUP)
{
KeyUp?.Invoke(this,new KeyEventArgs((Keys)kbStruct.VirtualKeyCode));
}
}
return CallNextHookEx(_hookHandle,nCode,wParam,lParam);
}
public void Uninstall()
{
UnhookWindowsHookEx(_hookHandle);
}
}
我构建了KeyEvenArgs函数,如下所示:
internal class KeyEventArgs : EventArgs
{
private Keys virtualKeyCode;
public Keys KeyCode { get; }
public KeyEventArgs(Keys virtualKeyCode)
{
this.virtualKeyCode = virtualKeyCode;
}
}
我建立了一个名为“ Keys”的类,它与名称空间“ System.windows.Form.Keys”中的“ Keys”类完全相同
这是我使用挂钩函数的方式:
static void Main(string[] args)
{
//var kh = new KeyboardHook(true);
//kh.KeyDown += Kh_KeyDown;
//Application.Run();
Y2KeyboardHook _y2KeyboardHook;
_y2KeyboardHook = new Y2KeyboardHook();
_y2KeyboardHook.Install();
_y2KeyboardHook.KeyDown += (sender,e) =>// ghi nhan thong tin tu ban phim
{
Console.Write("Keycode: "+e.KeyCode.ToString());
};
Console.ReadLine();
}
我的问题是我尝试在Windows上运行它,当我按下该键时没有任何错误,我想要当我按下一个键时,控制台窗口将显示该键的“键码”。我哪里做错了?有人知道请帮助我,非常感谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)