2016-02-18 3 views
0

Я пытаюсь разработать приложение, которое может блокировать ввод с помощью сканера RFID, который действует как клавиатура в окнах. Я попытался выполнить это с использованием сырого ввода и клавиатурного крючка, но проблема в том, что клавиатурный крючок работает до того, как я могу получить информацию о необработанном устройстве ввода, чтобы решить заблокировать сообщение или нет. мое приложение должно работать на всех потоках. Пожалуйста, помогите мне !Отличительный RFID-сканер с клавиатуры в C#

`

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

Я использовал низкоуровневый клавиатурный крючок и rawinput api, чтобы принять решение. я выложу код ниже –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^