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;
}

现在的问题编译运行都可以 了,但是运行后中,只要点击 任何按键,程序就会直接死掉。就是未响应。。。这个现在应该表明我使用的钩子应该成功拦截到了按键信息,但是就是不能进行下一步的程序处理了。
...全文
510 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
MessageBox不适合输出调试信息。
枫舞的季节 2014-09-08
  • 打赏
  • 举报
回复
你没有消息循环么? GetMessage TranslateMessage DispatchMessage ? 输出消息不要输出MessageBox ,这个很容易卡死。OutputDebutString 输出,文件输出也可以。程序是自己调试出来的,不是写出来的。写得再好,遇到问题不会解决也废。你什么功能都没有写,只是调用了CallNextHookEx按道理不应该有问题,如果再有问题,最好帖出全部代码。
  • 打赏
  • 举报
回复
引用 3 楼 justin_bkdrong 的回复:
使用你的代码:此处省略
使用了你的代码调用后,能拦截到按键信息,但是拦截后,无法实现输入的问题,而且程序也是未响应。 我猜测应该是return CallNextHookEx(hHook,nCode,wParam,lParam); 。。就是说拦截消息后我们处理后,没有传给下一个应该该 消息的函数 。。还有就是这应该和c语言程序 有关,毕竟c语言程序我们无法看到它的窗口生成,及消息处理函数 。 如果有消息处理函数这样就好办多了。 谁有空看到了,知道的点点吧,你说下相关关键词,我自己去查找相关资料。
枫舞的季节 2014-09-07
  • 打赏
  • 举报
回复
使用你的代码:
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;
}
  • 打赏
  • 举报
回复
引用 1 楼 justin_bkdrong 的回复:
凭空判断是不好判断。在SetWindowsHookEx返回值给hHook ,而此值是在 CallNextHookEx时候用到,是否有可能hHook没有赋值就被 CallNextHookEx调用了。 一般的做法是在dll中封装一个 HookFun一个UnHookFun ,调用这些导出函数就不用导出hHook 了,这样就没有问题,你的程序中最好多打印些日志或者trace信息,好能准确判断程序运行的位置。
求楼主给你示例代码,我是个新手。第一次,dll中封装一个 HookFun一个UnHookFun 相关。谢谢了。
枫舞的季节 2014-09-07
  • 打赏
  • 举报
回复
凭空判断是不好判断。在SetWindowsHookEx返回值给hHook ,而此值是在 CallNextHookEx时候用到,是否有可能hHook没有赋值就被 CallNextHookEx调用了。 一般的做法是在dll中封装一个 HookFun一个UnHookFun ,调用这些导出函数就不用导出hHook 了,这样就没有问题,你的程序中最好多打印些日志或者trace信息,好能准确判断程序运行的位置。
VC++ MFC 经典教程 - 基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4 11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 13.MFC_GDI_画文本和字体.mp4 14.MFC_GDI_备用对象和取消选定.mp4 15.MFC_Ruler.mp4 16.MFC_窗口滚动条.mp4 17.MFC_Accel.mp4 18.MFC_Accel(2).mp4 19.MFC_消息框.mp4 2.Windows_编程模型.mp4 20MFC_客户区鼠标消息.mp4 21.MFC_TicTac-1.mp4 22.MFC_TicTac-2.mp4 23.MFC_TicTac-3.mp4 24.MFC_鼠标滚轮.mp4 25.MFC_捕获鼠标.mp4 26.MFC_VisualKB-1.mp4 27.MFC_VisualKB-2.mp4 29.MFC_菜单.mp4 3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4 32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4 35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7种方法_A.mp4 37.MFC_对话框_访问控件_7种方法_B.mp4 38.MFC_对话框_访问控件_7种方法_C.mp4 39.MFC_对话框_复选框_单选钮.mp4 4.MFC_消息映射.mp4 40.MFC_模态对话框.mp4 41.MFC_非模态对话框.mp4 42.MFC_属性表.mp4 43.MFC_公用对话框.mp4 44.MFC_数组类-1.mp4 45.MFC_数组类-2.mp4 46.MFC_CArray.mp4 47.MFC_列表类.mp4 48.MFC_映射类.mp4 49.MFC_类型指针类.mp4 5.MFC_使用向导快速进行MFC程序设计.mp4 50.MFC_CFile.mp4 51.MFC_CArchive.mp4 52.MFC_四个对象四种方法.mp4 53. MFC_Ruler.mp4 54.MFC_Ruler.mp4 55.MFC_Ruler.mp4 56.MFC_SdiSquares.mp4 57.MFC_Scroll_Ruler.mp4 58.MFC_CHtmlView.mp4 59.MFC_CTreeView.mp4 6.MFC_字符集和TEXT宏.mp4 60.MFC_CListView.mp4 61.MFC_MdiSquares.mp4 62.MFC_动态拆分窗口.mp4 63.MFC_ToolBar.mp4 64.MFC_ToolBar_Ex13a.mp4 65.MFC_StatusBar.mp4 66.MFC_StatusBar_Ex13b.mp4 67.MFC_Rebar.mp4 68.MFC_EZPrint.mp4 69.MFC_Print_Bubble.mp4 7.MFC_建立应用程序.mp4 8.MFC_第一个MFC程序设计(不用向导).mp4 9.MFC_Windows_GDI_设备描述表类.mp4 数据结构与算法_C语言 01.swap.mp4 02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4 07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速排序.mp4 11.归并排序.mp4 12.顺序栈.mp4 13.顺序队列.mp4 14.链表的基本概念.mp4 15.单链表的基本运算.mp4 16.循环单链表.mp4 17.双向链表.mp4 18.链式栈.mp4 19.链式队列.mp4 20.基数排序.mp4 21.树.mp4 22.二叉树的存储表示与实现.mp4 23.二叉树的遍历.mp4 24.二叉查找树.mp4 25.红黑树.mp4 26.堆.mp4 27.堆排序.mp4 28.哈希表.mp4 29.图_邻接矩阵

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧