C# 如何在DOTNET CORE 3.1应用程序控制台c中读取键盘数据#
我正在.NET CORE 3.1平台上构建一个应用程序,计划在我的Raspberry Pi 4上运行它。但当应用程序处于隐形模式时,我从键盘读取数据时出错。(我实际上从QRcode机器读取数据)。 我使用hook,下面是我的hook函数:C# 如何在DOTNET CORE 3.1应用程序控制台c中读取键盘数据#,c#,.net,.net-core,keyboard,hook,C#,.net,.net Core,Keyboard,Hook,我正在.NET CORE 3.1平台上构建一个应用程序,计划在我的Raspberry Pi 4上运行它。但当应用程序处于隐形模式时,我从键盘读取数据时出错。(我实际上从QRcode机器读取数据)。 我使用hook,下面是我的hook函数: class Y2KeyboardHook { public delegate void KeyEventHandler(object sender, KeyEventArgs e); #region Win32 API Functions a
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 wParam, 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 wParam, 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);
}
}
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();
}
我构建了一个名为“Keys”的类,它与命名空间“System.windows.Form.Keys”中的类“Keys”完全相同
下面是我如何使用钩子函数:
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 wParam, 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 wParam, 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);
}
}
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上运行它,当我按下键时没有任何错误,我希望当我按下一个键时,控制台窗口将显示该键的“Keycode”。我哪里出错了?任何人都知道,请帮助我,非常感谢