失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c语言数字按键消息响应' c语言程序使用钩子拦截键盘消息的有关问题

c语言数字按键消息响应' c语言程序使用钩子拦截键盘消息的有关问题

时间:2019-02-15 07:52:36

相关推荐

c语言数字按键消息响应' c语言程序使用钩子拦截键盘消息的有关问题

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语言程序使用钩子拦截键盘消息的有关问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。