其实网上谈钩子(HOOK)函数的原理、应用已经很多拉。我对HOOK理解也是略知一、二,只是想写几句,自娱自乐,于是写了:
目的:让键盘锁定一段时间,然后自动解锁。
原理:利用全局钩子函数(键盘钩子)
1 创建动态连接库,代码:
HookDll.cpp
//*****************************
// 全局HOOK
// UnReal@2005-12-29
//*****************************
#include "stdafx.h"
#pragma data_seg("mydata")
HANDLE g_hand = NULL;
HINSTANCE g_hMod = NULL;
HHOOK g_hKeyHook = NULL;
#pragma data_seg()
LRESULT CALLBACK KeyboardProc(int code,
WPARAM wParam,
LPARAM lParam)
{
return 1;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
g_hMod = (HINSTANCE)hModule;
return TRUE;
}
void test() //测试函数
{
MessageBox(NULL,"你的键盘将在3分钟之类无
法进行输入,休息一下吧!",
"UnReal友情提示",0);
}
void SetHook(HANDLE hand)
{
g_hand = hand;
g_hKeyHook = ::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hMod,0);
}
void UnSetHook()
{
::Sleep(3*60*1000);
MessageBox(NULL,
"该工作拉 ^-^ ",
"UnReal友情提示",0);
::UnhookWindowsHookEx(g_hHook);
} 2 创建调用程序,代码:
System32.cpp
//*****************************
// HOOK调用程序 *
// UnReal@2005-12-29 *
//*****************************
#include "stdafx.h"
typedef void (*PFUNC)();
typedef void (*PFUNCSET)(HANDLE hand);
typedef void (*PFUNCUNSET)();
LRESULT CALLBACK MouseProc(int nCode,
WPARAM wParam,
LPARAM lParam)
{
return 1;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HMODULE hMod = LoadLibrary("HookDll");
if(hMod!=NULL)
{
PFUNCSET pFuncSet = (PFUNCSET)GetProcAddress(hMod,"SetHook");
if(pFuncSet!=NULL)
{
pFuncSet(hInstance);
}
PFUNC pFunc = (PFUNC)GetProcAddress(hMod,"test");
if(pFunc!=NULL)
{
pFunc();
}
PFUNCUNSET pFuncUnSet = (PFUNCUNSET)GetProcAddress(hMod,"UnSetHook");
if(pFuncUnSet != NULL)
{
pFuncUnSet();
}
FreeLibrary(hMod);
}
return 0;
}
3 将第一步生成的HookDll.dll 复制到装载dll的可执行文件目录,运行exe文件。
msdn上查查函数SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);设置idHook可以
编写不同的钩子函数,有兴趣的朋友自己研究研究。
呵呵^-^ 上班时间,空了再写,再完善……