windows api学习笔记-键盘钩子

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

DLL项目的头文件

#ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif

#define HM_KEY WM_USER+101

BOOL 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;//此结构请查看MSDN
	if(::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;
}
目录
相关文章
|
2月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
98 9
|
2月前
|
Windows
重装系统学习笔记(一):Windows10重装步骤(正版)
这篇博客文章详细介绍了如何使用微软官方工具重装Windows 10系统,包括下载安装工具、准备U盘、设置BIOS以及系统安装的步骤。
48 0
重装系统学习笔记(一):Windows10重装步骤(正版)
|
3月前
|
Docker Windows Python
Windows-Docker学习笔记(一)
本文介绍了Windows环境下Docker的安装与使用方法。首先通过链接下载Windows版本的Docker,然后按步骤配置:启用Windows功能、设置默认WSL版本为2,并检查Docker及其组件是否正常工作。接着详细列出了Docker的基础命令及其用法,包括搜索、下载镜像、管理容器等。同时介绍了Dockerfile的编写方法及其构建过程,以及docker-compose.yml文件的用途。最后提供了运行和管理容器的具体示例。
Windows-Docker学习笔记(一)
|
3月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
4月前
|
人工智能 监控 安全
F5社区学习笔记:API和AI如何改变应用安全?
F5社区学习笔记:API和AI如何改变应用安全?
54 1
|
4月前
|
jenkins API 持续交付
jenkins学习笔记之十五:SonarSQube API使用
jenkins学习笔记之十五:SonarSQube API使用
|
7月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
535 1
|
7月前
|
XML API 数据格式
【Qt 学习笔记】QWidget的enable属性 | API的介绍
【Qt 学习笔记】QWidget的enable属性 | API的介绍
190 0
|
7月前
|
网络协议 Shell vr&ar
某教程学习笔记(一):1、windows基础
某教程学习笔记(一):1、windows基础
35 0
|
存储 缓存 API
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
158 0