【Demo 0029】截取同进程窗体消息

今天这个话题比较简单,仅截取同进程的窗体消息,如果我们再做一些处理做成一个DLL然后将DLL驻入到指定进程的窗体中那更有意思了, 我们将在后面的章节里再研究一下。 我们开始学习了。 本节与上一节都在讲述着同相的内容围绕着GetWindowLongPtr, SetWindowLongPtr两个API进行的

(一) 函数声明

      LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex );

      LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong );

      获取/修改Window窗体信息值

     

      Code1:  通过修改窗体过程函数来截取窗体消息

     1.  为了保存原窗体过程函数, 我们将它到设置USER_DATA位,实现各函数数据共享;

     2.  通过SetWindowLongPtr, 来设置新的窗体过程函数;    


if (! bHook )
{
     TCHAR szTmp [ MAX_PATH ];
     TCHAR szClsName [ MAX_PATH ];
     GetClassName ( hWnd , szClsName , MAX_PATH );
     WNDCLASSEX wcx     = {0};
     wcx . cbSize         = sizeof ( WNDCLASSEX );
    
     SetWindowText ( GetDlgItem ( hWnd , ID_BTNHOOKMSG ), _T ( "Stop Hook" ));
     OutputDebugString ( _T ( "\n============== Start Hook Message ================\n" ));
    
     GetClassInfoEx ( GetModuleHandle ( NULL ), szClsName , & wcx );
     _stprintf_s ( szTmp , _T ( "WndProc Value before SetWindowLongPtr: 0x%0X  ==> 0x%0X\n" ), wcx . lpfnWndProc , GetWindowLongPtr ( hWnd , GWLP_WNDPROC ));
     OutputDebugString ( szTmp );

     SetWindowLongPtr ( hWnd , GWLP_USERDATA , ( LONG ) WndProc );
     SetWindowLongPtr ( hWnd , GWLP_WNDPROC , ( LONG ) _HookWndProc );

     GetClassInfoEx ( GetModuleHandle ( NULL ), szClsName , & wcx );
     _stprintf_s ( szTmp , _T ( "WndProc Value After SetWindowLongPtr: 0x%0X  ==> 0x%0X\n" ), wcx . lpfnWndProc , GetWindowLongPtr ( hWnd , GWLP_WNDPROC ));
     OutputDebugString ( szTmp );
     OutputDebugString ( _T ( "==================================================================\n" ));
     bHook = true ;
} else {
     SetWindowText ( GetDlgItem ( hWnd , ID_BTNHOOKMSG ), _T ( "Start Hook" ));
     OutputDebugString ( _T ( "\n============== Stop Hook Message ================\n" ));
     SetWindowLongPtr ( hWnd , GWLP_USERDATA , ( LONG )0);
     SetWindowLongPtr ( hWnd , GWLP_WNDPROC , ( LONG ) WndProc );
     bHook = false ;
}

    3.  在新的窗体过程函数中打印被截取消息

   


//
LRESULT CALLBACK _HookWndProc ( HWND hWnd , UINT nMsg , WPARAM wParam , LPARAM lParam )
{
     TCHAR szTemp [256];
     _stprintf_s ( szTemp , _T ( "[HookProc msg] => hWnd: 0x%06X  nMsg: %06X  wParam: 0x%06X  lParam: 0x%06X\n" ),
                 hWnd , nMsg , wParam , lParam );
     OutputDebugString ( szTemp );

     WNDPROC _oldWndProc = ( WNDPROC ) GetWindowLongPtr ( hWnd , GWLP_USERDATA );
     if ( NULL == _oldWndProc )    
    {
         _oldWndProc = ( WNDPROC ) GetClassLongPtr ( hWnd , GCLP_WNDPROC );
    }
     return _oldWndProc ( hWnd , nMsg , wParam , lParam );
}

 

   演示结果:

   1.  没修改窗体过程前

[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBA  lParam: 0x2000012
[WndProc msg] => hWnd: 0x010BBA  nMsg: 0000A0  wParam: 0x000012  lParam: 0x282023C
[WndProc msg] => hWnd: 0x010BBA  nMsg: 0002A2  wParam: 0x000000  lParam: 0x000000
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000086  wParam: 0x000000  lParam: 0x000000
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000006  wParam: 0x000000  lParam: 0x000000
[WndProc msg] => hWnd: 0x010BBA  nMsg: 00001C  wParam: 0x000000  lParam: 0x001B10
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000008  wParam: 0x000000  lParam: 0x000000
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000281  wParam: 0x000000  lParam: 0xC000000F
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000282  wParam: 0x000001  lParam: 0x000000

   2.   修改窗体过程之后

============== Start Hook Message ================
WndProc Value before SetWindowLongPtr: 0x8C11B8  ==> 0x8C11B8
WndProc Value After SetWindowLongPtr: 0x8C11B8  ==> 0x8C10DC
==================================================================
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000111  wParam: 0x0003E9  lParam: 0x010BBE
[HookProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[HookProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[HookProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001

  3.  恢复原窗体过程

============== Stop Hook Message ================
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000111  wParam: 0x0003E9  lParam: 0x010BBE
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001
[WndProc msg] => hWnd: 0x010BBA  nMsg: 000020  wParam: 0x010BBE  lParam: 0x2000001

(二) 特别说明

    演示的代码里我们也在设置窗体过程函数前后打印了WNDCLASSEX类信息, 也发布我们设置的窗体过程并没有修改了WNDCLASS wndProc;

 

演示代码

转载于:https://www.cnblogs.com/ztercel/archive/2011/08/19/2146299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了校园失物招领网站的信息化建设,极大的方便了相关的工作人员对校园失物招领网站信息进行管理。 本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布寻物启事等功能。 管理员可以选择任一浏览器打开网址,输入信息无误后,以管理员的身份行使相关的管理权限。管理员可以通过选择失物招领管理,管理相关的失物招领信息记录,比如进行查看失物招领信息标题,修改失物招领信息来源等操作。管理员可以通过选择公告管理,管理相关的公告信息记录,比如进行查看公告详情,删除错误的公告信息,发布公告等操作。管理员可以通过选择公告类型管理,管理相关的公告类型信息,比如查看所有公告类型,删除无用公告类型,修改公告类型,添加公告类型等操作。寻物启事管理页面,此页面提供给管理员的功能有:新增寻物启事,修改寻物启事,删除寻物启事。物品类型管理页面,此页面提供给管理员的功能有:新增物品类型,修改物品类型,删除物品类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值