【问题标题】:Global Keyboard intercept input全局键盘拦截输入
【发布时间】:2016-12-23 22:46:15
【问题描述】:

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

Using global keyboard hook (WH_KEYBOARD_LL) in WPF / C#

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

我已添加以下内容,但字符仍会添加到记事本中。

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

回报应该是不同的东西吗?

【问题讨论】:

    标签: c# wpf keyboard hook barcode-scanner


    【解决方案1】:

    编辑 - 我似乎在查看错误消息,所以我删除了整个旧答案。

    这似乎是正确的回调函数LowLevelKeyboardProc callback function。这就是它对返回值的说法:

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

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

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

    【讨论】:

    • 我已将更改添加到问题中,这是正确的返回吗?我检查了调试,它肯定使用了 isHandled 下的返回。
    • 我看错地方了。进行了修改,希望对您有所帮助。
    • 好!很抱歉最初的混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多