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不适合输出调试信息。

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

  1. ActiveX控件键盘消息无法响应 ATL COM

    最近使用ATL创建了一个复合控件,想在其上面相应Delete的键盘消息,但发现直接响应WM_KEYDOWN消息竟然没反应,事情是这样的: 1.起初我直接添加消息WM_KEYDOWN的响应函数,键盘按下 ...

  2. windows 键盘消息的机制

    在Microsoft Windows 98中,键盘和鼠标是两个标准的使用者输入来源,在一些连贯操作中常产生互补作用.当然,鼠标在今天的应用程序中比十年前使用得更为广泛.甚至在一些应用程序中,我们更习惯 ...

  3. 拦截Windows消息

    拦截Windows消息 C++ Builder不愧为Borland公司的优秀产品,用它来开发Windows程序非常快捷高效,但在编程过程中你也会发现它的一些限制性,让你无法实现自己的想法.比如你无法在 ...

  4. 语言做的表白魔方_程序员表白教程,这些代码用过的都说浪漫

    作为一名程序员,如何用自己的技术向喜欢的人表白? 这篇程序员表白教程,可以让你创造出不一样的浪漫! 你值得拥有! 1. I Love You Batch le 不如送她一个惊喜? 让她的电脑自动关机, ...

  5. C语言软件分层的方法,单片机程序分层设计思想

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如今C语言已经成为单片机程序设计公认的语言.我用C语言进行单片机程序设计也有两年多的时间了,C语言程序的特点使我对单片机开发更加感兴趣.让我从一个了解单片 ...

  6. 编程语言基础c语言第5版讲解,《程序设计基础》C语言基础知识讲解.ppt

    <<程序设计基础>C语言基础知识讲解.ppt>由会员分享,可在线阅读,更多相关<<程序设计基础>C语言基础知识讲解.ppt(54页珍藏版)>请在人人文库 ...

  7. 背口诀14天精通c语言pdf下载,C语言必背18个经典程序

    C语言必背18个经典程序 1./*输出9*9口诀.共9行9列,i控制行,j控制列.*/ #include "stdio.h" main() {int i,j,result; for ...

  8. python语言程序设计嵩天-Python语言程序设计基础(第2版)嵩天课后答案

    嵩天.礼欣.黄天羽Python语言程序设计基础(第2版)习题答案本书提出了以理解和运用计算生态为目标的Python语言教学思想,在系统讲解Python语言语法的同时介绍了从数据理解到图像处理的14个P ...

  9. python语言程序设计基础网课-Python语言程序设计基础答案

    [填空题]逻辑型数据在参与算术运算的过程中可以被当作整数进行操作,通常True的值对应整数1,False的值对应整数____________. [单选题]在Python中,不可以用来表示字符串的符号是 ...

  10. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

最新文章

  1. 边缘计算 — 起源与定义
  2. 【前端词典】如何向老板解释反向代理
  3. 论文笔记:ZFNet
  4. python 福利彩票_使用Python买福彩,5个数字,20选5,有没买过
  5. Eclipse新建的Maven项目想修改DynamicWebModule,直接去项目目录下修改
  6. php数组修改键值,php数组中子数组如何修改键值
  7. 插入节点insertBefore()
  8. 为什么那些每三年跳一次槽的人越跳越好? - 震撼
  9. 机器学习之数理统计与参数估计的相关知识总结
  10. Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数
  11. 现代软件工程 第五章 【团队和流程】练习与讨论
  12. axios拦截器_77.9KStar 的 Axios 项目有哪些值得借鉴的地方
  13. java考勤表导出_考勤表如何导出?
  14. 教师计算机应用能力现状分析,信息技术教学应用个人现状分析以及发展计划
  15. 脚本精灵服务器引擎数据为空,脚本精灵服务器
  16. 判断质数、分解质因数
  17. JWT解析及安全问题
  18. 移动端手指事件和手机事件:
  19. strtoupper() 把字符串转换为大写字母
  20. SSM 博客系统开发实战

热门文章

  1. Tizen已经够烂了 但份额还是超过了黑莓
  2. [Visual Studio] VS2012调试时很慢的解决方案
  3. jquery时间倒计时
  4. ios控件 UIViewController
  5. Jquery 查看DOM上绑定的事件列表
  6. Oracle 11g R1(11.1) Joins表连接
  7. MFC对COM接口编写的支持分析
  8. 30. 实体和编码(2)
  9. 对JS中变量的浅微认识
  10. swt中关于Text.setSelection()的记录