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

问题描述

我正在.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 (将#修改为@)