vc6.0会做钩子的来
请高手写一代码给我学习:
要求:假设一窗口句柄hWnd
用键盘钩子钩,放在DLL里,每向其按键就messagebox一下其按键值
请将完整的代码加注释告诉我
谢谢
要WinMain和DLLMain的
不要那些封装好的
参考答案:代码比较长,我给你分一下部分。
1.开始是DLL main函数
#include "stdafx.h"
// 全局变量
LPDWORD g_lpdwVirtualKey = NULL; // Keycode 数组的指针
int g_nLength = 0; // Keycode 数组的大小
BOOL g_bDisableKeyboard = FALSE; // 是否屏蔽整个键盘
HINSTANCE g_hInstance = NULL; // 模块实例句柄
HHOOK g_hHook = NULL; // 钩子句柄
//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}
2.底层键盘钩子函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// 禁用键盘的某个按键, 如果 g_bDisableKeyboard 为 TRUE 则禁用整个键盘
if (nCode == HC_ACTION)
{
if (g_bDisableKeyboard) return TRUE;
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < g_nLength; i++)
{
if (pStruct->vkCode == *tmpVirtualKey++)
//在这里做你想做的事情,如,你想要的messagebox.这里就是按键消息
return TRUE;
}
}
// 传给系统中的下一个钩子
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
3.设置钩 子,也就是你在外部要调用这个DLL的这个函数后,就会开始记录
BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength, BOOL bDisableKeyboard = FALSE)
{
// 如果已经安装键盘钩子则返回 FALSE
if (g_hHook != NULL) return FALSE;
// 将用户传来的 keycode 数组保存在全局变量中
g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < nLength; i++)
{
*tmpVirtualKey++ = *lpdwVirtualKey++;
}
g_nLength = nLength;
g_bDisableKeyboard = bDisableKeyboard;
// 安装底层键盘钩子
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
if (g_hHook == NULL) return FALSE;
return TRUE;
}
4.取消记录,没什么说的。退出,不想记录时调用一下。
BOOL WINAPI StopMaskKey()
{
// 卸载钩子
if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;
g_hHook = NULL;
return TRUE;
}
4.在DEF文件中显示导出已下几个函数
EXPORTS
StartMaskKey @1
StopMaskKey @2