我正在尝试开发一款可以阻止来自RFID扫描仪输入的应用程序,该扫描仪就像Windows中的键盘一样。我试图用原始输入和键盘钩子完成这个,但问题是键盘钩子运行之前我可以获得有关原始输入设备的信息,以决定是否阻止消息。我的应用程序必须在所有线程上运行请帮帮我!
`
public partial class Form1 : Form
{
private readonly RawInput _rawinput;
globalKeyboardHook gkh;
bool _blockKeyboard = false;
public Form1()
{
InitializeComponent();
_rawinput = new RawInput(Handle, false);
gkh = new globalKeyboardHook();
gkh.HookedKeys.Add(Keys.D0);
gkh.HookedKeys.Add(Keys.D1);
gkh.HookedKeys.Add(Keys.D2);
gkh.HookedKeys.Add(Keys.D3);
gkh.HookedKeys.Add(Keys.D4);
gkh.HookedKeys.Add(Keys.D5);
gkh.HookedKeys.Add(Keys.D6);
gkh.HookedKeys.Add(Keys.D7);
gkh.HookedKeys.Add(Keys.D8);
gkh.HookedKeys.Add(Keys.D9);
gkh.HookedKeys.Add(Keys.Enter);
gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
_rawinput.KeyPressed += OnKeyPressed;
}
private void OnKeyPressed(object sender, RawInputEventArg e)
{
label1.Text = e.KeyPressEvent.DeviceName;
if (e.KeyPressEvent.DeviceName.Contains("VID_1D57"))
{
_blockKeyboard = true; //blochez
}
else
_blockKeyboard = false;
}
void gkh_KeyUp(object sender, KeyEventArgs e)
{
}
void gkh_KeyDown(object sender, KeyEventArgs e)
{
if (_blockKeyboard)
{
lstLog.Items.Add("Down\t" + e.KeyCode.ToString());
e.Handled = true;
}
else
e.Handled = false;
}
}
} `
答案 0 :(得分:0)
我修改了我的代码。现在我使用WH_KEYBOARD HOOK,但它只在当前线程上运行。如果我把0而不是AppDomain.GetCurrentThreadId(),它不再起作用。如何让它在所有线程上运行?
private void InstallHook()
{
_hWndServer = this.Handle;
proc = new HookHandlerDelegate(KeyboardProc);
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
_hookHandle = (IntPtr)SetWindowsHookEx(WH_KEYBOARD, proc, GetModuleHandle(curModule.ModuleName), AppDomain.GetCurrentThreadId());
}
}