c语言程序使用钩子拦截键盘消息的问题
我在c语言中调用dll中函数的代码如下://.9.7使用钩子后,点击按键后程序会直接死掉。。
#pragmacomment(lib,"keyBoard.lib")
//要从DLL中输入的变量和函数
extern"C"__declspec(dllimport)HHOOKhHook;//
extern"C"__declspec(dllimport)
LRESULTCALLBACKKeyboardProc
(intnCode,WPARAMwParam,LPARAMlParam);
intmain()
{
//SetConsoleCtrlHandler((PHANDLER_ROUTINE)MyHandler,TRUE);//增加打开数据库,忘记关闭数据库的操作。
hHook=SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc,
GetModuleHandle("keyBoard.dll"),
0);
while(1)
{这里是若干代码}
}
我dll代码如下:extern"C"__declspec(dllexport)HHOOKhHook=NULL;
//DLL自用的全局变量
FILE*fl;
charbuffer=0;
//定义全局的键盘勾子函数:
//DLL输出的勾子函数
extern"C"__declspec(dllexport)
LRESULTCALLBACKKeyboardProc(
intnCode,
WPARAMwParam,//虚键代码
LPARAMlParam//击键消息的信息
)
{
if(lParam&0x80000000)
{//如果某键按下
MessageBox(NULL,TEXT("拦截按键信息成功"),TEXT(""),MB_OK);
}
returnCallNextHookEx(hHook,nCode,wParam,lParam);
}
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
returnTRUE;
}
现在的问题编译运行都可以了,但是运行后中,只要点击任何按键,程序就会直接死掉。就是未响应。。。这个现在应该表明我使用的钩子应该成功拦截到了按键信息,但是就是不能进行下一步的程序处理了。
------解决思路----------------------
凭空判断是不好判断。在SetWindowsHookEx返回值给hHook,而此值是在CallNextHookEx时候用到,是否有可能hHook没有赋值就被CallNextHookEx调用了。
一般的做法是在dll中封装一个HookFun一个UnHookFun,调用这些导出函数就不用导出hHook了,这样就没有问题,你的程序中最好多打印些日志或者trace信息,好能准确判断程序运行的位置。
------解决思路----------------------
使用你的代码:
HHOOKg_hook=NULL;
HMODULEg_hDllModule=NULL;
BOOLEAN
WINAPI
DllMain(
INHINSTANCEhDllHandle,
INDWORDnReason,
INLPVOIDReserved
)
{
g_hDllModule=hDllHandle;
returnTRUE;
}
__declspec(dllexport)BOOLHook()
{
g_hook=SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc,
g_hDllModule,
0);
returng_hook?TRUE:FALSE;
}
__declspec(dllexport)BOOLUnhook()
{
returnUnhookWindowsHookEx(g_hook);
}
exe调用:
typedefBOOL(*LPHOOK)();
typedefBOOL(*LPUNHOOK)();
LPHOOKg_hookFun=NULL;
LPUNHOOKg_unhookFun=NULL;
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
HMODULEh=LoadLibrary("keyBoard.dll");//路径要设置正确啊
if(h)
{
g_hookFun=(LPHOOK)GetProcAddress(h,"Hook");
g_unhookFun=(LPUNHOOK)GetProcAddress(h,"Unhook");
}
...
returnTRUE;
}
------解决思路----------------------
你没有消息循环么?
GetMessageTranslateMessageDispatchMessage?输出消息不要输出MessageBox,这个很容易卡死。OutputDebutString输出,文件输出也可以。程序是自己调试出来的,不是写出来的。写得再好,遇到问题不会解决也废。你什么功能都没有写,只是调用了CallNextHookEx按道理不应该有问题,如果再有问题,最好帖出全部代码。
------解决思路----------------------
MessageBox不适合输出调试信息。
如果觉得《c语言数字按键消息响应' c语言程序使用钩子拦截键盘消息的有关问题》对你有帮助,请点赞、收藏,并留下你的观点哦!