调用.cpp
#include "stdafx.h"
typedef HHOOK (* pfunc)(HINSTANCE);HHOOK HK;
int main(int argc, char* argv[])
{
HINSTANCE hmod;
hmod=LoadLibrary("dd.dll");//动态加载dll
if(hmod!=NULL)
{
pfunc sethook=(pfunc)GetProcAddress(hmod,"WindowsHook");//调用dll中的函数
HK=sethook(hmod);
}
MessageBox(NULL,"这是一个钩子的例子这是一个钩子的例子这是一个钩子的例子","这是",0);
UnhookWindowsHookEx(HK);
return 0;
}
DLL内部
HHOOK WindowsHook(HINSTANCE hInstance)
{
g_Hook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardHookProc,hInstance,GetCurrentThreadId());
return g_Hook;
}
LRESULT CALLBACK KeyBoardHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
char ch=0;
FILE *fl;
if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有键按下
{
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
{
fl=fopen("key.txt","a+"); //输出到key.txt文件
if (wParam==VK_RETURN)
{
ch=' ';
}
else
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
//ch=MapVirtualKey(wParam,2); //把虚键代码变为字符
ch =char(w);
MessageBox(NULL,&ch,"提示",0);
}
fwrite(&ch, sizeof(char), 1, fl);
}
fclose(fl);
}
return CallNextHookEx( g_Hook, nCode, wParam, lParam );
}
声明:#include <windows.h>
extern "C" _declspec (dllexport) LRESULT CALLBACK KeyBoardHookProc(int nCode,WPARAM wParam,LPARAM lParam);
extern "C" _declspec (dllexport) HHOOK WindowsHook(HINSTANCE hInstance);