DLL项目的头文件

#ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif#define HM_KEY WM_USER+101BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId = 0,HWND hWndCaller=NULL);

DLL项目CPP文件

#include <windows.h>
#define KEYHOOKLIB_EXPORT
#include "a.h"#pragma data_seg("MyShared")//用共享数据段来保存主窗口句柄和钩子句柄
HWND g_hWndCaller = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()//通过内存地址取得模块句柄
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{MEMORY_BASIC_INFORMATION mbi;//此结构请查看MSDNif(::VirtualQuery(pv,&mbi,sizeof(mbi))){return (HMODULE)mbi.AllocationBase;}return NULL;
}//钩子的回调函数
LRESULT CALLBACK KeyHookProc(int nCode,//HOOK代码,钩子函数使用这个参数来确定任务WPARAM wParam,LPARAM lParam)
{if(nCode<0||nCode == HC_NOREMOVE)//没用的消息{return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);}if(lParam&0x40000000)//消息重复{return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);}::PostMessage(g_hWndCaller,WM_CLOSE,0,0);return ::CallNextHookEx(g_hHook,nCode,wParam,lParam);
}//给系统注册钩子
BOOL WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId,HWND hWndCaller)
{BOOL bOK;g_hWndCaller = hWndCaller;if(bInstall){HMODULE temp = ModuleFromAddress(KeyHookProc);//钩子函数所在的DLL的实例句柄g_hHook = ::SetWindowsHookEx(WH_KEYBOARD,//键盘钩子标志KeyHookProc,//回调函数temp,dwThreadId//线程句柄);if(g_hHook!=NULL){bOK = TRUE;}else{bOK = FALSE; }}else{bOK = ::UnhookWindowsHookEx(g_hHook);//卸载钩子g_hHook = NULL;}return bOK;
}

DLL项目的DEF文件

LIBRARY    "gouzi"
EXPORTS
SetKeyHook
SECTIONS
MyShared Read Write Shared

注册钩子的工程

#include <windows.h>
#include <iostream>
#include "a1.h"//DLL中的头文件
using namespace std;
#pragma comment(lib,"gouzi")void main()
{::SetConsoleTitle("aaa");//HWND hWnd = ::FindWindow(NULL,"Our First Window");HWND hWnd = ::FindWindow("notepad",NULL);//::SendMessage(hWnd,HM_KEY,)if(!SetKeyHook(TRUE,0,hWnd)){cout<<"安装钩子失败"<<endl;return;}char a;while(true){cin>>a;if(a == 'u'){SetKeyHook(FALSE,0,hWnd);return;}}return;
}

转载于:https://www.cnblogs.com/liulun/archive/2010/02/08/1666047.html

windows api学习笔记-键盘钩子相关推荐

  1. windows api学习笔记-简单的记事本

    #include <windows.h> #include "resource.h" #include <string>LRESULT CALLBACK M ...

  2. Windows系统调用学习笔记(一)—— API函数调用过程

    Windows系统调用学习笔记(一)-- API函数调用过程 Windows API 实验1:分析ReadProcessMemory 第一步:定位函数 第二步:开始分析 总结 实验2:分析NtRead ...

  3. Windows APC学习笔记(一)—— APC的本质备用APC队列

    Windows APC学习笔记(一)-- APC的本质&备用APC队列 基础知识 APC的本质 APC队列 APC结构 分析 KiServiceExit 总结 备用APC队列 挂靠环境下Apc ...

  4. Windows系统调用学习笔记(四)—— 系统服务表SSDT

    Windows系统调用学习笔记(四)-- 系统服务表&SSDT 要点回顾 系统服务表 实验:分析 KiSystemService 与 KiFastCallEntry 共同代码 SSDT 实验: ...

  5. Windows系统调用学习笔记(三)—— 保存现场

    Windows系统调用学习笔记(三)-- 保存现场 要点回顾 基本概念 Trap Frame 结构 线程相关的结构体 ETHREAD KTHREAD CPU相关的结构体 KPCR _NT_TIB KP ...

  6. Windows系统调用学习笔记(二)—— 3环进0环

    Windows系统调用学习笔记(二)-- 3环进0环 要点回顾 基本概念 _KUSER_SHARED_DATA 0x7FFE0300 实验:判断CPU是否支持快速调用 第一步:修改EAX=1 第二步: ...

  7. Crypto API 学习笔记一

    标 题: [原创]Crypto API 学习笔记一 作 者: jdxyw 时 间: 2006-09-01,16:47 链 接: http://bbs.pediy.com/showthread.php? ...

  8. php shellcode,Windows Shellcode学习笔记

    0x00 前言 Windows Shellcode学习笔记--通过VisualStudio生成shellcode,shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload). 在渗 ...

  9. Windows异常学习笔记(五)—— 未处理异常

    Windows异常学习笔记(五)-- 未处理异常 要点回顾 最后一道防线 实验一:理解最后一道防线 实验二:新线程的最后一道防线 总结 UnhandledExceptionFilter 实验三:理解U ...

最新文章

  1. 认识网页:html + css + JavaScript
  2. Verilog随机数生成$random
  3. 我的node+express小例子
  4. 计算机控制综合应用题,计算机网络管理综合应用题
  5. 启动计算机引导win10,教您win10引导项丢失怎么办
  6. 以太坊go-ethereum项目源码本地环境搭建
  7. 2010年浙江大学计算机及软件工程研究生机试真题
  8. ARP欺骗:先认识再防御
  9. 一步步编写操作系统 23 重写主引导记录mbr
  10. 做网络需要掌握的56句话
  11. Ubuntu环境搭建支持设备树,内核和根文件系统启动
  12. 12月4日云栖精选夜读:乌镇AI论坛最全盘点:中国互联网半壁江山坐在了一起,他们怎么看AI...
  13. 智慧发电厂+智能发电厂web端平台管理系统+Axure高保真智慧电厂系统+能耗管理+告警管理+生产监控+安防设备管理+运维设备管理+监控面板+系统管理+智慧电厂+电厂系统+axure源文件+rp原型
  14. 【笔记】【C语言】任意进制之间的转换(支持小数部分)
  15. Android基础:Android布局
  16. MATLAB聚类分析学习笔记
  17. 布谷鸟过滤器java使用_Redis布隆过滤器与布谷鸟过滤器
  18. Win系统设置虚拟内存
  19. bluefish编辑器的配置
  20. OC简介及基本语法(一)

热门文章

  1. JS:ES6-8 Promise入门
  2. Promise机制(持续更新中)
  3. JQuery的$.extend()的源码
  4. 零基础带你学习MySQL—数学函数(十四)
  5. 解决安装XAMPP 浏览器输入localhost 出现404错误的问题
  6. 解决VScode安装Babel转码器报错:无法将“cnpm“项识别为cmdlet\函数、脚本文件或可运行程序的名称的问题
  7. freebasic 编译linux,FreeBasic库文件入门 [SJ ZERO原创,沧海冷心翻译]
  8. TCP/IP参考模型、五层参考模型
  9. 俗语:“生不睡柳,死不睡杨”,有什么道理?
  10. 焦虑症患者,整天心神不宁,忧心忡忡怎么办?