C# 如何在DOTNET CORE 3.1应用程序控制台c中读取键盘数据#

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

我正在.NET CORE 3.1平台上构建一个应用程序,计划在我的Raspberry Pi 4上运行它。但当应用程序处于隐形模式时,我从键盘读取数据时出错。(我实际上从QRcode机器读取数据)。 我使用hook,下面是我的hook函数:

 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”。我哪里出错了?任何人都知道,请帮助我,非常感谢