低级键盘挂钩&来自rawinput的击键

时间:2012-10-25 19:45:48

标签: c# keyboard-hook raw-input low-level-api

目前,我正在制作一个拦截特定键盘击键的程序(使用其HID进行过滤)。因此,为了知道特定设备发送了哪些击键,我使用了RawInput技术,受到这个伟大教程的启发:

http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

现在,它运行得很好:我可以获得击键并知道哪个键盘生成了它。

我项目的难点在于拦截和阻止来自这个特定键盘的击键,以避免这些击键到达焦点应用程序(聚焦意味着操作系统带来的前景窗口)。

因此,在具有窗口句柄的所有当前线程上,自然解决方案是一个低级全局钩子。

我使用并调整了此页面中的代码来执行此操作:

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

我在visual studio中创建了一个新项目,以避免在我的工作中乱七八糟。经过一些研究,我能够通过在回调函数中返回值(-1)来阻止所有应用程序的击键:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)  
{
//Check if we have a key to pass

if (
    nCode >= 0 && ( 
    (wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP) ) 
    )
{
    int vkCode = Marshal.ReadInt32(lParam);
    if ((Keys)vkCode == Form1.KeysToIgnore)
    {
        return (IntPtr)(-1);
    }
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

为了将所有内容(钩子程序和击键检测)放在一起,我在最终项目中创建了两个线程:

第一:使用RawInput识别每个击键并将其附加到设备

第二:用于挂钩所有窗口并阻止某些击键

线程1旨在发送按键以阻止线程2,该线程读取发送到所有窗口应用程序的所有消息以及来自特定键盘的垃圾按键。我确切地知道这两个线程是同步的。

问题是钩子似乎是在执行Rawinput之前执行的,所以我无法识别发送击键的键盘。我不知道该怎么做,也许更改钩子的类型(避免使用低级键盘钩子,但使用用户空间级别的键盘钩子)。

或许有人知道一种聪明的方式来做我想做的事情?

我知道这个请求真的很复杂,请不要犹豫,询问更多细节。

3 个答案:

答案 0 :(得分:3)

好的,Silence Dogood给了我一个很好的线索:

图书馆拦截非常适合我的使用。你可以在这里找到它:

https://github.com/oblitum/Interception

答案 1 :(得分:2)

我正在尝试将条形码扫描仪(使用隐藏式键盘仿真)制作为软件红色,而不是用作输入。

我发现了这个,但我不知道如何使用它,因为它不是完整的代码而且我是C#的新手,希望我能帮助你帮助我:

Intercept keyboard

答案 2 :(得分:1)

如果你在.net应用程序中实现这一点,我个人推荐EasyHook,这将允许你做更多的事情,而不仅仅是拦截击键,它很容易使用。