全局键盘拦截输入

Jac*_*coT 5 c# keyboard wpf hook barcode-scanner

我目前能够使用此解决方案在程序未聚焦时捕获键盘输入。

在 WPF/C# 中使用全局键盘钩子 (WH_KEYBOARD_LL)

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

我添加了以下内容,但这些字符仍然添加到记事本中。

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);
Run Code Online (Sandbox Code Playgroud)

回报应该是不同的吗?

R.R*_*sev 3

编辑-我看起来似乎看到了错误的消息,所以我删除了整个旧答案。

这似乎是正确的回调函数LowLevelKeyboardProc 回调函数。这就是它所说的返回值:

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

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

因此返回除零以外的任何内容都应该可行。