C# 全局键盘截取输入

C# 全局键盘截取输入,c#,wpf,keyboard,hook,barcode-scanner,C#,Wpf,Keyboard,Hook,Barcode Scanner,我目前能够捕获键盘输入,而程序不在焦点使用此解决方案 然而,我想知道,如果输入符合某些条件,是否有可能阻止其他应用程序使用输入,我想使用它在后台运行时将条形码捕获到我的程序中,但如果您在记事本中工作,最好不要在那里键入条形码 我已经添加了以下内容,但字符仍然添加到记事本中 if (nCode >= 0) { if (wParam == (IntPtr)InterceptKeys.WM_KEYDOWN) { int vkCode = Marshal.ReadInt3

我目前能够捕获键盘输入,而程序不在焦点使用此解决方案

然而,我想知道,如果输入符合某些条件,是否有可能阻止其他应用程序使用输入,我想使用它在后台运行时将条形码捕获到我的程序中,但如果您在记事本中工作,最好不要在那里键入条形码

我已经添加了以下内容,但字符仍然添加到记事本中

if (nCode >= 0)
{
   if (wParam == (IntPtr)InterceptKeys.WM_KEYDOWN)
   {
      int vkCode = Marshal.ReadInt32(lParam);
      RawKeyEventArgs rk = new RawKeyEventArgs(vkCode, false);                    

      if (KeyDown != null)
         KeyDown(this, rk);
      if (rk.isHandled)
      {
         return (IntPtr)0;
      }
   }
}

return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);

返回的内容应该是不同的吗?

编辑-我看到的是错误的消息,因此我删除了旧答案的全部内容

这似乎是正确的回调函数。这是它对返回值的说明:

如果nCode小于零,则钩子过程必须返回CallNextHookEx返回的值

如果nCode大于或等于零,并且钩子过程没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,安装了WH_-KEYBOARD_-LL钩子的其他应用程序将不会收到钩子通知,因此可能会表现不正确如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。


因此,返回除零以外的任何值都应该有效。

我已将更改添加到问题中,这是正确的返回值吗?我检查了调试,它肯定使用了isHandled下的返回。我看错了地方。做了一个编辑,希望对你有帮助。很好!很抱歉最初的混乱。