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

博主在C语言中尝试通过DLL调用键盘钩子函数,但运行后点击按键会导致程序崩溃。问题可能在于钩子函数的使用不当,如hHook未正确赋值或使用MessageBox输出调试信息引起阻塞。解决方案包括在DLL中封装钩子的安装和卸载函数,避免直接导出hHook,以及使用更适合的调试输出方式,如OutputDebugString。同时,确保存在消息循环以处理消息。
摘要由CSDN通过智能技术生成

c语言程序使用钩子拦截键盘消息的问题

我在c语言中调用dll中函数的代码如下 ://2014.9.7使用钩子后,点击按键后程序会直接死掉。。

#pragma comment(lib,"keyBoard.lib")

//要从DLL中输入的变量和函数

extern "C" __declspec(dllimport) HHOOK hHook;//

extern "C" __declspec(dllimport)

LRESULT CALLBACK  KeyboardProc

(int nCode, WPARAM wParam, LPARAM lParam);

int main()

{

//SetConsoleCtrlHandler((PHANDLER_ROUTINE)MyHandler, TRUE);//增加打开数据库,忘记关闭数据库的操作。

hHook=SetWindowsHookEx(WH_KEYBOARD,

KeyboardProc,

GetModuleHandle("keyBoard.dll"),

0);

while(1)

{这里是若干代码}

}

我dll代码如下:extern "C" __declspec(dllexport) HHOOK hHook=NULL;

// DLL 自用的全局变量

FILE * fl ;

char buffer=0;

//定义全局的键盘勾子函数:

//DLL输出的勾子函数

extern "C" __declspec(dllexport)

LRESULT CALLBACK KeyboardProc(

int nCode,

WPARAM wParam,  //虚键代码

LPARAM lParam   // 击键消息的信息

)

{

if(lParam & 0x80000000)

{//如果某键按下

MessageBox(NULL,TEXT("拦截按键信息成功"),TEXT(""),MB_OK);

}

return CallNextHookEx(hHook,nCode,wParam,lParam);

}

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

现在的问题编译运行都可以 了,但是运行后中,只要点击 任何按键,程序就会直接死掉。就是未响应。。。这个现在应该表明我使用的钩子应该成功拦截到了按键信息,但是就是不能进行下一步的程序处理了。

------解决思路----------------------

凭空判断是不好判断。在SetWindowsHookEx返回值给hHook ,而此值是在 CallNextHookEx时候用到,是否有可能hHook没有赋值就被 CallNextHookEx调用了。

一般的做法是在dll中封装一个 HookFun一个UnHookFun ,调用这些导出函数就不用导出hHook 了,这样就没有问题,你的程序中最好多打印些日志或者trace信息,好能准确判断程序运行的位置。

------解决思路----------------------

使用你的代码:

HHOOK g_hook = NULL;

HMODULE g_hDllModule = NULL;

BOOLEAN

WINAPI

DllMain(

IN HINSTANCE hDllHandle,

IN DWORD     nReason,

IN LPVOID    Reserved

)

{

g_hDllModule = hDllHandle;

return TRUE;

}

__declspec(dllexport) BOOL Hook()

{

g_hook=SetWindowsHookEx(WH_KEYBOARD,

KeyboardProc,

g_hDllModule,

0);

return g_hook?TRUE:FALSE;

}

__declspec(dllexport) BOOL Unhook()

{

return UnhookWindowsHookEx(g_hook);

}

exe调用:

typedef BOOL (*LPHOOK)();

typedef BOOL (*LPUNHOOK)();

LPHOOK g_hookFun = NULL;

LPUNHOOK g_unhookFun = NULL;

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

HMODULE h = LoadLibrary("keyBoard.dll");//路径要设置正确啊

if(h)

{

g_hookFun = (LPHOOK)GetProcAddress(h,"Hook");

g_unhookFun = (LPUNHOOK)GetProcAddress(h,"Unhook");

}

...

return TRUE;

}

------解决思路----------------------

你没有消息循环么?

GetMessage TranslateMessage DispatchMessage ? 输出消息不要输出MessageBox ,这个很容易卡死。OutputDebutString 输出,文件输出也可以。程序是自己调试出来的,不是写出来的。写得再好,遇到问题不会解决也废。你什么功能都没有写,只是调用了CallNextHookEx按道理不应该有问题,如果再有问题,最好帖出全部代码。

------解决思路----------------------

MessageBox不适合输出调试信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值