DLL项目的头文件
代码语言:javascript复制#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文件
代码语言:javascript复制#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文件
代码语言:javascript复制LIBRARY "gouzi"
EXPORTS
SetKeyHook
SECTIONS
MyShared Read Write Shared
注册钩子的工程
代码语言:javascript复制#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;
}