为什么MFC的窗口程序都是 AfxWndProc

 

我们都知道MFC的窗口例程都是 AfxWndProc,下面就来分析是怎样实现的。

 

我们在wnd的Create函数或者dialog的DoModel函数里面都会看到一个函数:AfxHookWindowCreate(this);  

在这个函数里面最重要的一句语句是:

::SetWindowsHookEx(WH_CBT,   _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());  

 

  1. void AFXAPI AfxHookWindowCreate(CWnd* pWnd)  
  2.     {  
  3.         _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();//看下面的说明   
  4.         if (pThreadState->m_pWndInit == pWnd)  
  5.             return;  
  6.   
  7.         if (pThreadState->m_hHookOldCbtFilter == NULL)  
  8.         {//可以看出,这if之后进来一次,可以调用多次。   
  9.             pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,  
  10.                 _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());  
  11.             if (pThreadState->m_hHookOldCbtFilter == NULL)  
  12.                 AfxThrowMemoryException();  
  13.         }  
  14.         //···   
  15.         pThreadState->m_pWndInit = pWnd;  
  16.     }  

SetWindowsHookEx函数的作用是:给线程安装一个WH_CBT钩子,当激活,创建,销毁··一个窗口的时候回先调用这个钩子函数通知我们。也就是在线程创建窗口时,在窗口接收第一个消息之前会调用我们 _AfxCbtFilterHook 这个函数。

然后 _AfxCbtFilterHook 这个函数把 原来旧的窗口程序换成了 AfxWndProc。  这个钩子保证窗口在收到第一个消息前执行,也就保证了第一条消息的正确处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
03-16
WinProc是一个在Windows下通用的进程管理工具,它除了具有一般进程管理工具的所有功能,还有一些自己的特色。下面是功能简介: 进程信息查看:可以查看进程的详细信息,包括线程数、模块数、占用内存、文件路径及进程相关的进程、线程详细信息等。 进程优先级设置:你可以主观上控制进程的CPU占用时间。 杀进程:WinProc提供多种杀进程方式。 1.在进程列表中直接双击可以结束选定进程; 2.在进程列表中右击选定进程,在弹出菜单中选择“结束该进程之后所有进程”可以用来对付令人讨厌的一直跑出来的IE窗口; 3.将一个或者多个进程加入待结束进程列表,可是对多个进程同时进行操作,比如全部结束或者定时结束; 4.另外右击系统通知区的WinProc小图标,在弹出菜单的杀进程子菜单中选择所要结束的进程,可以快速结束进程,全都是鼠标操作。 定时操作:在WinProc中可以定时结束进程或者定时关机。 保存进程列表:以文本方式保存当前系统运行的进程列表,以备查看,比较平庸的一个功能。 进程黑名单:顾名思义,将进程加入进程黑名单后,该进程将无法被启动。至于这样做的意义何在,就看什么人怎么用了,呵呵。 锁定屏幕:当你离开电脑的时候可以将屏幕锁定,没有你的密码将无法解锁,但是别人可以在你的屏幕上给你留言,用用就知道了。 热键激活WinProc:可以按热键(F12)激活或者隐藏WinProc,而且需要说明的是该热键穿透力很强,你甚至可以在一些屏蔽了热键的程序中激活WinProc。 热键杀进程:这个功能是为了应急而设计的。比如你在上班时间打游戏的时候,老板突然出现...如果你事先把一些比较敏感的程序(这里是游戏)加入待结束进程列表的话,不要急,只要按一下ScrLock,那尴尬的一幕将不复出现。 快速重启、注销、关机:如果你什么都喜欢快的话,这个功能或许能帮上忙。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值