windows api学习笔记-键盘钩子

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;
}
时间: 2024-11-08 21:31:57

windows api学习笔记-键盘钩子的相关文章

windows api学习笔记-使用定时器

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

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

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

Windows Api学习笔记-动态连接库(DLL)的使用

#include <windows.h> #include <iostream> #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout<<fnMy12Dll()<<endl; char b; cin>>b; } VS2008 新建WIN3

windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)

#include <windows.h>//系统会自动连接到指定的库文件lib #include <tlhelp32.h>//声明快照函数的头文件 #include <stdio.h>//std io 标准输入输出接口 #include <iostream> using namespace std; int main() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSna

windows api学习笔记-多线程

#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI ThreadProc(LPVOID lpParam) { int i = 0; while(i<20) { cout<<i<<endl; i++; } return 0; } int main() { HANDLE hThread; DWORD dwThreadId; hThread = ::Create

windows api学习笔记-用临界区对象使线程同步

#include <windows.h> #include <iostream> #include <process.h> using namespace std; int g_nCount1 = 0; int g_nCount2 = 0; CRITICAL_SECTION g_cs;//临界区 BOOL g_bContinue = TRUE;//线程结束标志 UINT WINAPI MyThread(LPVOID) { while(g_bContinue) { ::E

windows api学习笔记-终止其他进程

#include .h>.h>//系统会自动连接到指定的库文件lib #include .h>.h>//std io 标准输入输出接口 #include using namespace std; int main() { char szCommandLine[] = "cmd"; STARTUPINFO si = {sizeof(si)};// PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW;/

Windows录音API学习笔记--转

Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct {     WORD      wMid; 用于波形音频输入设备的设备驱动程序制造商标识符.     WORD      wPid; 声音输入设备的产品识别码.     MMVERSION vDriverVersion; 用于波形音频输入设备的设备驱动程序的版本号.高位字节是主版本号,低字节是次版本号.     CHAR      szPna

Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化

本文讲的是Windows Shellcode学习笔记--shellcode在栈溢出中的利用与优化, 0x00 前言 在<Windows Shellcode学习笔记--shellcode的提取与测试>中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通过程序实现自动提取机器码作为shellcode并保存到文件中. 0x01 简介 先从最入门的缓冲区溢出开始 本文将要结合<0day安全:软件漏洞分析技术>中的"栈溢出原理与实践"