WINDOWS键盘钩子

2023-11-17

最近有个需求做的时候碰到需要捕获某个程序的特定按键并且在该程序处于焦点并且按下特定键(如F1)时让主板的蜂鸣器响一声以提示,由于该程序没有源码,因此只能通过编写服务挂全局钩子来对该程序的键盘消息进行捕获。

大致的代码结构是使用VC现编写了一个DLL模块(因为是全局钩子嘛),DLL模块中导出安装和卸载钩子两个函数,然后在DLL中编写钩子回调函数,如下:


LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode <0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
if(wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT* pKBDllHookStruct = (KBDLLHOOKSTRUCT*)lParam;
DWORD dwvkKey = pKBDllHookStruct->vkCode;
char szProcessName[MAX_PATH] = {0};
//bool bSuccess = GetCurrentProcessName(szProcessName);  
//if(bSuccess && strcmp(szProcessName, "notepad") == 0)
//首先获取当前最前放窗体的句柄
HWND hWnd = GetForegroundWindow();
if(hWnd != INVALID_HANDLE_VALUE)
{
//获取窗体类名
char szWindowClassName[100]={0};
int n = GetClassName(hWnd, szWindowClassName, 100);
if(n > 0 && (strcmp(szWindowClassName, "Edit") == 0 || strcmp(szWindowClassName, "Notepad") == 0))
{
//被监听进程  
//调用蜂鸣器发声音
Beep(850, 500);
}
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

然后再用BCB编写了一个服务程序,在服务启动时加载DLL并且调用钩子安装函数(DLL中导出),在停止时调用钩子卸载函数并且卸载DLL模块,另外,BCB的服务工程要设置interactive属性为true,否则,服务进程中无法捕获到桌面消息。

例子中该回调函数的作用是对记事本进行按键捕获(未指定键值)

测试中发现该回调函数是在服务的进程中被调用的。

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

WINDOWS键盘钩子 的相关文章

  • 更改 mingw' 启动目录或创建 mingw 符号链接

    设置 mingw 控制台启动目录的最简单方法是什么 我只使用 mingw 进行编译 但由于缺乏编辑器甚至符号链接 我很困惑如何告诉 mingw 控制台出现在不同的目录而不是常规的主目录中 如果有人知道如何像 cygwin 那样将 真正的 符
  • 由于图形处理单元配置,不支持 Windows Phone 模拟器(Mac 上的 Windows 7)

    启动 Windows Phone 模拟器时出现错误 不支持 Windows Phone 模拟器 因为您的计算机没有所需的图形处理单元配置 如果没有图形处理单元 XNA 框架页面将无法运行 您想继续启动模拟器吗 当我尝试访问网页 任何网页 时
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 如何使用命令行压缩文件?

    我想使用批处理文件命令 Windows XP 批处理文件 压缩目录 例如 如果我想解压缩一个文件意味着我可以使用jar xf file zip java bat 文件命令 就像我想要一个命令行批处理来压缩目录一样 如果您使用的是 Ubunt
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 如何在批处理文件中回显换行符?

    如何从批处理文件输出中插入换行符 我想做类似的事情 echo hello nworld 这会输出 hello world Use echo hello echo echo world
  • 为什么我只能用管理员权限才能导入Python中的某些模块?

    我正在努力解决 Python 2 7 中的一些奇怪问题 我写了一个很长的工具 在其中导入不同的模块 我必须首先使用它安装pip 该工具将在公司内部共享 不同的用户在其特定机器上拥有不同的权限 当另一个用户登录我的计算机 我在那里拥有管理员权
  • teracopy 如何替换默认的 Windows 副本

    我问了这个问题Windows 文件复制内部结构 动态加密 https stackoverflow com questions 24220382 windows file copy internals on the fly encryptio
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • 所见即所得与 Unicode

    我在 Delphi 中编写了一个 Windows 程序 该程序使用 GetCharWidth 和 Em Square 将文本非常精确地放置并换行到屏幕和打印机 这对于 ANSI 文本效果很好 您只需要检索和计算 255 个字符的宽度 但当您
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • Google Cloud SDK 无法安装“.exe;.bat;.com”不是可识别的命令

    我正在尝试在 Windows 10 笔记本电脑上安装 google cloud SDK 我尝试删除安装文件夹中的空格 并将路径添加到我的环境变量中 完整的错误是 Output folder C Users user Documents Do
  • 当我启动 Windows 命令提示符时,我做了什么导致环境变量发生更改?

    我使用的是 Windows 10 x64 我安装了 Anaconda3 如果我启动 C Windows system32 cmd exe 时没有运行任何其他内容 并且在我可以看到的后台中没有任何有趣的内容 则以下内容将添加到控制面板 UI
  • 获取自动热键中的可用屏幕区域

    我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口 但在获取正确的屏幕尺寸值时遇到问题 我试图获取屏幕上可用区域的大小 通常是全屏分辨率减去任务栏 也许还有任何其他停靠窗口 如 Vista 中的侧边栏 我发现的获取屏幕宽度的方法
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta
  • Windows 上最快的屏幕捕获方法

    我想为Windows平台编写一个截屏程序 但不确定如何捕获屏幕 我知道的唯一方法是使用 GDI 但我很好奇是否还有其他方法可以实现此目的 如果有的话 哪种方法产生的开销最小 速度是首要任务 截屏程序将用于录制游戏镜头 不过 如果这确实缩小了
  • 如果我使用客户端计算机上未安装的字体,会发生什么情况?

    有人可以告诉我 如果我在 WinForms 应用程序中使用目标计算机上不可用的字体 会发生什么情况 它是否使用同一系列的字体 只是 Sans Serif 还是其他字体 您的应用程序将回退到 Segoe UI Tahoma 然后是 MS Sa

随机推荐

  • 用C语言打印九九乘法表

    运用c语言的分支和循环的知识就可以打印出来9 9的乘法表 效果如图 具体代码 可以深刻理解循环和嵌套循环的应用 int main int i 0 行数 for i 1 i lt 9 i 行数 打印9行 int j 0 列数 for j 1
  • k8s scheduler 调度与 kubelet 启动 Pod 流程总结(四)

    文章目录 scheduler predicate 和 priority 资源需求 把 Pod 调度到指定 Node 上 nodeSelector 亲和性和反亲和性 节点亲和性 Pod 亲和性 污点和容忍度 Controller Manage
  • 【JavaEE初阶】第九节.多线程 (基础篇)定时器(案例三)

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 JavaEE初阶 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 前言 一 定时器概述 二 定时器的实现 2 1 Java标准库 定时器的使用 2 2 自己模拟实现一
  • 使用mysql数据库插入中文全部变成问号

    下午使用MYSQL数据库 插入中文时候全部变成为问号 找了一下午都没有找到合适的答案 有点小伤心 一个小问题耗费这么多时间 后面按照网上的方法改来改去 最后甚至连插入中文都报错 遇到这样的问题 首先先不要着急 肯定是编码的问题 先检查下我们
  • spark写表指定外部表_Spark SQL 之自定义删除外部表

    Spark SQL 之自定义删除外部表 前言 Spark SQL 在删除外部表时 本不能删除外部表的数据的 本篇文章主要介绍如何修改 Spark SQL 源码实现在删除外部表的时候 可以带额外选项来删除外部表的数据 本文的环境是我一直使用的
  • 《万字长文带你解读AIGC》系列之技术篇

    欢迎关注 CVHub 官方微信公众号 前景回顾 Welcome to back 在 万字长文带你解读AIGC入门篇 一文中 我们详细为大家介绍了AIGC的相关概念 背景及其如此火爆的原因 接下来我们将进一步深入探讨AIGC背后的技术栈 作为
  • 【论文党福利】如何提取图像中的数据

    论文党福利 如何提取图像中的数据 从事科研的老师和同学们在撰写论文时 经常需要将文献中的曲线与自己的结果进行对比 为获取原始数据 最靠谱的方法当然是找原作者要 如果没有要到呢 本文将成为论文党的福利 为你提供你两种解决方案 均是用matla
  • Vue2.0+webpack 引入字体文件(eot,ttf,woff)

    webpack base config js 需要配置 test woff2 eot ttf otf loader url loader options limit 10000 name utils assetsPath fonts nam
  • 图形学相关期刊和会议的基本信息

    目录 期刊 A类 ACM TOG A类 IEEE TIP A类 IEEE TVCG B类 TOMCCAP B类 CAGD B类 CGF B类 CAD B类 GM B类 TCSVT B类 TMM B类 SIIMS C类 CGTA C类 CAV
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)

    0x00 前言 使用各种的shell工具获取到目标权限 即可进行数据操作 今天来简要分析一下目前常使用的各类shell管理工具的流量特诊 帮助蓝队同学在风险识别上快速初值 0x01 中国菜刀流量分析 payload特征 PHP ASP AS
  • ElasticSearch系列-索引原理与数据读写流程详解

    索引原理 倒排索引 倒排索引 Inverted Index 也叫反向索引 有反向索引必有正向索引 通俗地来讲 正向索引是通过key找value 反向索引则是通过value找key ES底层在检索时底层使用的就是倒排索引 索引模型 现有索引和
  • JAVA(Object和String)一 Object类和String字符串的理解和使用

    JAVA Object和String 一 Object类和String字符串的理解和使用 Object类 String类 Object类 理解 在JAVA中有一个非常特殊的类叫做Object类 JAVA里面所有的类都继承自Object类 我
  • Git下载/查看/切换/新建分支

    1 git下载指定分支代码 git clone b branchname https github com xxx xxx git 2 看分支 git branch 列出本地已经存在的分支 并且当前分支会用 标记 git branch r
  • Element ui Dialog弹出框宽度固定不变

    一般我们引用Dialog弹出框时 弹出框的大小都是用width 30 这样来设置 这样的话我们在缩小屏幕的时候弹出框就会根据你缩小屏幕的宽度的百分比来设置 这样你弹出框里面的东西就会溢出 如果你不想溢出就把宽度写成width 500px 这
  • 文件上传服务器例子,服务器端的程序优化

    package cn dali4 code04ex 此程序优化了文件名 这样可以随机生成文件名 给服务器写了循环 可以一直监听 开启了多线程 优化了执行的效率 import java io import java net ServerSoc
  • C++代码注释详解

    常用注释语法 注释写在对应的函数或变量前面 JavaDoc类型的多行注释风格如下 这里为注释 一般注释中有简要注释和详细注释 简要注释有多种标识方式 这里推荐使用 brief命令强制说明 例如 brief 这里为简要注释 这里为详细注释 b
  • 正确使用g2o各类线性方程求解器

    g2o LinearSolverEigen g2o LinearSolverDense g2o LinearSolverCSparse g2o LinearSolverCholmod是常用的线性方程求解器 一套可运行程序 包括不同梯度下降优
  • Python中的异常处理raise介绍

    文章目录 0 介绍 1 raise 介绍 案例 2 raise 不需要参数 案例 3 raise 单独一个 raise 正常程序使用无参的 raise 4 其它案例 4 1 案例1 4 2 案例2 5 处理流程 总结 0 介绍 问题1 是否
  • eslint 搭配 vscode 的简单使用

    前言 刚开始时 由于嫌麻烦 并没有安装eslint 最近在新的项目上使用了eslint再配合vscode的插件 真是爽的不要太爽 因此打算写一篇简单的食用说明来记录食用过程 前期准备 没啥好准备的 作为开发肯定是具备yarn和node的 编
  • WINDOWS键盘钩子

    最近有个需求做的时候碰到需要捕获某个程序的特定按键并且在该程序处于焦点并且按下特定键 如F1 时让主板的蜂鸣器响一声以提示 由于该程序没有源码 因此只能通过编写服务挂全局钩子来对该程序的键盘消息进行捕获 大致的代码结构是使用VC现编写了一个