C# 中 TextBox只允许某个设备输入

C# 中 TextBox只允许某个设备输入,禁止用户键盘输入

点击查看代码
 public partial class Form1 : Form
    {
        private bool isBlockedInput = false;

        public Form1()
        {
            InitializeComponent();

            // 注册 RawInput
            RegisterKeyboardRawInput();

            // 设置窗体捕捉键盘事件
            this.KeyPreview = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void RegisterKeyboardRawInput()
        {
            RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[1];
            rid[0].usUsagePage = 0x01;
            rid[0].usUsage = 0x06; // 键盘
            rid[0].dwFlags = 0;
            rid[0].hwndTarget = this.Handle;

            if (!RegisterRawInputDevices(rid, (uint)rid.Length, (uint)Marshal.SizeOf(rid[0])))
            {
                MessageBox.Show("注册 RawInput 失败!");
            }
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_INPUT)
            {
                ProcessRawInput(m.LParam);
            }
            base.WndProc(ref m);
        }

        private void ProcessRawInput(IntPtr hRawInput)
        {
            uint dwSize = 0;
            GetRawInputData(hRawInput, RID_INPUT, IntPtr.Zero, ref dwSize, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER)));
            IntPtr buffer = Marshal.AllocHGlobal((int)dwSize);
            try
            {
                if (GetRawInputData(hRawInput, RID_INPUT, buffer, ref dwSize, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER))) != dwSize)
                    return;

                RAWINPUT raw = (RAWINPUT)Marshal.PtrToStructure(buffer, typeof(RAWINPUT));

                // 获取设备名称
                uint nameSize = 0;
                GetRawInputDeviceInfo(raw.header.hDevice, RIDI_DEVICENAME, IntPtr.Zero, ref nameSize);
                if (nameSize <= 0) return;

                IntPtr namePtr = Marshal.AllocHGlobal((int)nameSize);
                GetRawInputDeviceInfo(raw.header.hDevice, RIDI_DEVICENAME, namePtr, ref nameSize);
                string deviceName = Marshal.PtrToStringAnsi(namePtr);
                Marshal.FreeHGlobal(namePtr);

                // 判断是否是需要屏蔽的设备(你可以改为 "HID\\ConvertedDevice&Col01")
                if (deviceName != null && deviceName.Contains("PID_4001"))
                {
                    isBlockedInput = true;
                }
                else
                {
                    isBlockedInput = false;
                }
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }


        #region 原始输入结构体和常量

        private const int WM_INPUT = 0x00FF;
        private const int RID_INPUT = 0x10000003;
        private const int RIDI_DEVICENAME = 0x20000007;

        [StructLayout(LayoutKind.Sequential)]
        struct RAWINPUTDEVICE
        {
            public ushort usUsagePage;
            public ushort usUsage;
            public uint dwFlags;
            public IntPtr hwndTarget;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct RAWINPUTHEADER
        {
            public uint dwType;
            public uint dwSize;
            public IntPtr hDevice;
            public IntPtr wParam;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct RAWINPUT
        {
            public RAWINPUTHEADER header;
            public RAWKEYBOARD keyboard;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct RAWKEYBOARD
        {
            public ushort MakeCode;
            public ushort Flags;
            public ushort Reserved;
            public ushort VKey;
            public uint Message;
            public uint ExtraInformation;
        }

        [DllImport("User32.dll")]
        static extern bool RegisterRawInputDevices(RAWINPUTDEVICE[] pRawInputDevices, uint uiNumDevices, uint cbSize);

        [DllImport("User32.dll")]
        static extern uint GetRawInputData(IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader);

        [DllImport("User32.dll", SetLastError = true)]
        static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize);

        #endregion

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!isBlockedInput)
            {
                e.Handled = true; // 阻止输入
            }
        }

    }
posted @ 2025-04-12 16:50  远方の梦  阅读(18)  评论(0)    收藏  举报