MFC:HOOK编程

MFC:HOOK编程SetWindowsHo 安装一个应用程序定义的 hook 过程到 hook 链中 后安装的 hook 过程在 hook 链的前面 eg MFC 屏蔽当前进程主线程的键盘鼠标消息 HHOOKg hKeyboard NULL HHOOKg hMouse HWNDg hWnd NULL LRESULTCALLB nbsp 鼠标消息过程 nbsp int



SetWindowsHookEx():安装一个应用程序定义的hook过程到hook链中,后安装的hook过程在hook链的前面.

eg: //MFC,屏蔽当前进程主线程的键盘鼠标消息
HHOOK g_hKeyboard=NULL;
HHOOK g_hMouse;
HWND g_hWnd=NULL;
LRESULT CALLBACK MouseProc(  //鼠标消息过程





  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates

)
{



return 1; //返回非零值表示对消息进行了处理,系统就不会向下传递

}

LRESULT CALLBACK KeyboardProc(  //键盘消息过程




  int code,       // hook code

  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information

)
{



//if(VK_SPACE==wParam || VK_RETURN==wParam)
/*if(VK_F4==wParam && (1==(lParam>>29 & 1)))


return 1;

else

return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/

if(VK_F2==wParam)
{



::SendMessage(g_hWnd,WM_CLOSE,0,0);

UnhookWindowsHookEx(g_hKeyboard);

UnhookWindowsHookEx(g_hMouse);

}
return 1;

}
在OnInitDialog中:


g_hWnd=m_hWnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
//第三个参数:和当前进程的主线程相关,所以为NULL,因此第四个参数要传递当前线程的ID


/*/
eg:   //屏蔽所有正在运行程序的键盘鼠标消息
//第四个参数为0,第三个参数为动态链接库的句柄
动态链接库文件:
#include


HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
#pragma data_seg(“MySec”)  //节
HWND g_hWnd=NULL; //必须初始化
#pragma data_seg()   //节
//#pragma comment(linker,”/section:MySec,RWS”) //共享,这样其他程序下F2也能关闭应用程序
/*HINSTANCE g_hInst;
BOOL WINAPI DllMain(














  HINSTANCE hinstDLL,  // handle to the DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved

)
{



g_hInst=hinstDLL; //法一:调用SetWindowsHookEx时可以用g_hInst

}*/
/
LRESULT CALLBACK MouseProc(



  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates

)
{



return 0;

}

LRESULT CALLBACK KeyboardProc(




  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information

)
{



if(VK_F2==wParam)
{

SendMessage(g_hWnd,WM_CLOSE,0,0);

UnhookWindowsHookEx(g_hMouse);

UnhookWindowsHookEx(g_hKeyboard);

}
return 1;

}
void SetHook(HWND hwnd)
{




g_hWnd=hwnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle(“Hook”),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(“Hook”),0);

}//GetModuleHandle:法二,自动加扩展名.dll
/


Hook.def:

LIBRARY Hook
EXPORTS
SetHook @2  //函数的序号
SEGMENTS   //节 共享(法二)
MySec READ WRITE SHARED



/
应用程序:


_declspec(dllimport) void SetHook(HWND hwnd);
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_CXSCREEN);
cyScreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW); 
SetHook(m_hWnd);




/
利用钩子可以获取其他程序的数据,例如可以获取密码…(通过安装一个WH_GETMESSAGE钩子)
//钩子种类很多,好好研究研究






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229998.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:22
下一篇 2026年3月16日 下午3:22


相关推荐

  • charles抓包整理

    charles抓包整理这里汇总了工作中charles的使用。Fidder使用C#开发的,所以就不能在Mac上使用了,不过还有另外一个抓包神器,就是Charles,它是Java开发的,所以跨平台,不仅可以在Mac上使用,Linux以及Window下都是可以使用的,当然需要安装JDK,才能运行,同时还有一个问题就是他是收费的。Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器…

    2022年5月20日
    50
  • 为什么L1正则化导致稀疏解「建议收藏」

    一、从数据先验的角度首先你要知道L1范式和L2范式是怎么来的,然后是为什么要把L1或者L2正则项加到代价函数中去.L1,L2范式来自于对数据的先验知识.如果你认为,你现有的数据来自于高斯分布,那么就应该在代价函数中加入数据先验P(x),一般由于推导和计算方便会加入对数似然,也就是log(P(x)),然后再去优化,这样最终的结果是,由于你的模型参数考虑了数据先验,模型效果当然就更好.哦对了,如果你…

    2022年4月12日
    71
  • 详细介绍:[500页电子书]构建自主AI Agent系统的蓝图:谷歌重磅发布智能体设计模式指南

    详细介绍:[500页电子书]构建自主AI Agent系统的蓝图:谷歌重磅发布智能体设计模式指南

    2026年3月16日
    2
  • 主流前端-后端-数据库总结-后端框架篇

    主流前端-后端-数据库总结-后端框架篇一、传统框架介绍1)Hibernate是一种ORM框架,在Java对象与关系型数据库之间建立某种映射,以实现直接存取Java对象(POJO)。2)ORM框架是一种不同与MVC的另一种思想框架,适用范围也与MVC截然不同。3)需要创建一系列的持久化类,每个类的属性都可以简单的看做和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表件关联的对应。4)当我们需要相关操…

    2022年5月20日
    57
  • origin并列柱状图怎么画_多簇并列堆积柱形图

    origin并列柱状图怎么画_多簇并列堆积柱形图1.打开Origin在工作簿中,输入数据,Y有两列2.选择相应数据并绘图3.修改图的设置修改纵坐标修改颜色修改图例4.保存为图片在word中双击图片,设置图片边框最终图片效果…

    2026年4月16日
    3
  • python nonetype_Python NoneType类型

    python nonetype_Python NoneType类型PythonNoneTy 类型 NoneType 是一类特别的类型 该类型只能有一个值 None 而且该值几乎没有任何可以做的操作 那其作用是什么呢 由于每个变量一定要有一个值 必须指向一个对象 在我们不知道其应该取什么值时就可以让其等于 None 请看下面的例子 a Noneb Noneid a 所有值为 None 的对象的地址相同 执行同一个对象 43685

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号