gpt4 book ai didi

c# - 来自 rawinput 的低级键盘钩子(Hook)和击键

转载 作者:太空狗 更新时间:2023-10-29 23:09:07 25 4
gpt4 key购买 nike

目前,我正在编写一个程序来拦截来自特定键盘的击键(使用其 HID 进行过滤)。因此,为了了解特定设备发送了哪些击键,我使用了 RawInput 技术,灵感来自这个很棒的教程:

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

现在,它工作得很好:我可以获得击键并知道是哪个键盘生成的。

我的项目的困难部分是拦截和阻止来自这个特定键盘的击键,以避免这些击键到达焦点应用程序(焦点是指操作系统带来的前台窗口)。

因此自然的解决方案是在所有具有窗口句柄的当前线程上使用低级全局 Hook 。

我使用并改编了此页面中的代码来做到这一点:

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

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

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

2nd : 用于 Hook 所有窗口并阻止某些击键

线程 1 旨在将击键发送到线程 2,线程 2 读取发送到所有窗口应用程序的所有消息并从特定键盘回收击键。我明确指出这两个线程是同步的。

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

或者也许有人知道一个聪明的方法来做我想做的事?

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

最佳答案

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

Interception 库非常适合我使用。你可以在这里找到它:

https://github.com/oblitum/Interception

关于c# - 来自 rawinput 的低级键盘钩子(Hook)和击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com