编程语言
首页 > 编程语言> > c# – 来自rawinput的低级键盘钩子和击键

c# – 来自rawinput的低级键盘钩子和击键

作者:互联网

目前,我正在制作一个拦截特定键盘击键的程序(使用其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);
}

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

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

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

线程1被设计为发送键击以阻止线程2,线程2读取发送到所有窗口应用程序的所有消息和来自特定键盘的垃圾键击.我确切地知道这两个线程是同步的.

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

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

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

解决方法:

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

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

https://github.com/oblitum/Interception

标签:c,raw-input,keyboard-hook,low-level-api
来源: https://codeday.me/bug/20190517/1124034.html