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; // 阻止输入
}
}
}

浙公网安备 33010602011771号