在C#中区分RFID扫描仪和键盘

时间:2016-02-18 12:33:25

标签: c# hook raw-input

我正在尝试开发一款可以阻止来自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;

    }


}

}   `

1 个答案:

答案 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());
        }
    }