来自原始输入的低级键盘挂钩和击键

2023-11-26

目前,我正在编写一个程序来拦截来自特定键盘的击键(使用其 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

我在视觉工作室中创建了一个新项目,以避免给我的工作带来混乱。经过一些研究,我能够通过在回调函数中返回值(-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 识别每个击键并将其附加到设备

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

线程 1 旨在将击键发送到线程 2,以阻止线程 2,线程 2 读取发送到所有窗口应用程序的所有消息,并从特定键盘中删除击键。我确切地说这两个线程是同步的。

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

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

我知道这个请求确实很复杂,请随时询问更多详细信息。


好吧,沉默多古德给了我一个很好的线索:

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

https://github.com/oblitum/Interception

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自原始输入的低级键盘挂钩和击键 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 为什么我不应该将所有仅 PL/SQL 的 VARCHAR2 设为 32767 字节?

    或者我应该 标题的灵感来自于加里 迈尔斯 Gary Myers 在为什么 Oracle varchar2 有一个强制大小作为定义参数 考虑以下变量 declare database table column interfacing vari
  • 如何在 VB 和 C# 中从文件加载字体?

    我想从文件加载字体到我的 VB Form 程序中 例如 我的字体位于 exe 程序的同一文件夹中 我希望它保留为外部资源 我们可以替换该资源 以便它更改整个程序的字体 以下是如何在 C 中执行此操作的示例 System Drawing Te
  • 测试 Android IAP/应用内购买订阅

    我正在实现几个要在 Google Play 上启动的 Android 应用程序 它们都使用 Google IAP 自动续订订阅产品类型进行订阅 为了测试该应用程序 我执行了以下操作 已将二进制草案上传到 Google Play 但未发布 在
  • 具有 bash 可编程补全功能的条件尾随空格

    我正在创建一个函数来为我使用的命令提供可编程完成 在来自http www debian administration org articles 317 shell脚本的用法如下 script sh command command optio
  • JSON 中的反序列化和序列化是什么?

    我见过 JSON 中的术语 反序列化 和 序列化 他们的意思是什么 JSON 是一种对字符串中的对象进行编码的格式 序列化表示将对象转换为该字符串 and 反序列化是它的逆操作 转换字符串 gt 对象 当传输数据或将数据存储在文件中时 要求
  • 如何将 .exe 文件转换为 Windows 安装向导

    我正在通过 Tkinter 创建一个应用程序 制作完成后 我使用 pyinstaller 转换为 exe 文件 这很好 但我想让它更专业 就像我们从互联网下载任何应用程序并打开它一样 它会打开一个安装向导 其中包含许可协议以及所有文件的放置
  • 在 Mac OS X 编程时,是否有与 viewDidLoad 等效的方法? [复制]

    这个问题在这里已经有答案了 可能的重复 NSViewController 中的 viewDidLoad 我开始开发 iOS 应用程序 现在转向 Mac OS X 应用程序 我想知道 Mac OS X 中是否有类似 iOS 的 viewDid
  • ASP Classic 中的 If Not IsNull

    我对 asp 还很陌生 并且遇到了语法错误 如果可以的话 我希望得到帮助 我有一个 ASP 页面 显示一个从 sql 中提取数据的表 大部分数据尚未填充 因此返回 NULL 有问题的数据类型是数字 我需要FormatNumber the r
  • 如何在 Smalltalk 中在运行时向类添加方法?

    我正在为基于 XML 的 Web 服务构建 Smalltalk API XML 服务非常常规 我想我应该重写这些方法 而不是手动编写方法 doesNotUnderstand 通过动态添加方法MyApi class gt gt compile
  • Java 在一个语句中使用两个等号? [复制]

    这个问题在这里已经有答案了 有人可以帮助我理解以下代码的作用以及带有两个等号的行的作用吗 在这个构造函数中 某物等于某物等于某物如何工作 public More LinkedList header next header previous
  • 使用 Webpack、Jasmine (-core)、typescript 进行单元测试

    我有一个项目 它使用 webpack 将所有代码捆绑到一个文件中 该项目正在使用 Typescript 目前运行良好 我已经添加了单元测试 茉莉花似乎是前进的方式 众多方式之一 它实际上包含在 package json 中的 jasmine
  • ASP.Net 5 类库包中的 EntityFramework 命令?

    我正在尝试开发我的第一个 ASP Net Web 应用程序 在我的解决方案中我有两个项目 AWeb Application and Class Library Package 当我构建此应用程序的 ASP Net 4 5 版本时 我将Ent
  • 找到小于x的最大素数的算法[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何计算小于 x 的最大素数 事实上 它不必是精确的 只需近似且接近 x 即可 x 是一
  • 正则表达式匹配仅包含某些字符的整个单词

    我想匹配仅包含定义字符的整个单词 或真正的字符串 例如 如果字母是d o g dog match god match ogd match dogs no match because the string also has an s whic
  • 调整仪表板中整个标题栏的高度闪亮仪表板中的标题

    我看到这里有一个类似的问题 调整闪亮仪表板中仪表板标题的高度 但我没有资格对给定的答案发表评论 这个答案给出的解决方案将在我想扩大标题大小的情况下起作用 然而 当我将尺寸减小到 20 像素时 这只改变了标题的标题部分的高度 我想减小闪亮仪表
  • 如何使用Python抓取谷歌地图

    我正在尝试使用 python 从谷歌地图中抓取某个地方的评论数量 例如 Pike s Landing 餐厅 参见下面的谷歌地图 URL 有 162 条评论 我想在 python 中提取这个数字 URL https www google co
  • AudioManager 中的 setSpeakerphoneOn 不会更改 Android 12 上的扬声器值,它始终保持 false。为什么?

    fun toggleSpeaker context Context isSpeakerPhoneSelected value let val audioManager AudioManager context getSystemServic
  • 如何为 Spark Streaming 定义 Kafka(数据源)依赖项?

    我正在尝试使用 Spark streaming2 0 0 使用 kafka 0 8 主题 我正在尝试确定所需的依赖项 我已尝试在 build sbt 文件中使用这些依赖项 libraryDependencies org apache spa
  • 为什么抽象工厂使用抽象类而不是接口?

    我正在学习设计模式 书中的第一个例子是关于抽象工厂的 我已经在 VS 中构建了练习 一切看起来都不错 但有一个问题我想知道 书中工厂类的实现是这样的 public abstract class AbstractVehicleFactory
  • 来自原始输入的低级键盘挂钩和击键

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