MFC ActiveX里面的非模态对话框是没有消息循环的,必须得用Hook才行。在主窗体中增加hook处理
1.添加全局hook变量和回调函数
HHOOK hHook = NULL;//设立一个消息钩子
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
2.OnCreate函数中初始化hook
// Install the WH_GETMESSAGE hook function.
hHook = ::SetWindowsHookEx(
WH_GETMESSAGE,
GetMessageProc,
NULL,
GetCurrentThreadId());
ASSERT (hHook);
3.设置回调函数
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Switch the module state for the correct handle to be used.
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
// If this is a keystrokes message, translate it in controls'
// PreTranslateMessage().
LPMSG lpMsg = (LPMSG) lParam; if( (nCode >= 0) &&
PM_REMOVE == wParam &&
AfxGetApp()->PreTranslateMessage((LPMSG)lParam))
{
// The value returned from this hookproc is ignored, and it cannot
// be used to tell Windows the message has been handled. To avoid
// further processing, convert the message to WM_NULL before
// returning.
//MessageBox(NULL,_T("Test"),NULL,NULL);//测试
//lpMsg->message = WM_NULL;
//lpMsg->lParam = 0L;
lpMsg->wParam = 0;
}
// Passes the hook information to the next hook procedure in
// the current hook chain.
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
4.在OnClose函数中卸载hook
VERIFY (::UnhookWindowsHookEx (hHook));

解决方案 »

  1.   


    那就是我每响应一个消息事件,我就必须做一个对应的HOOK来触发它?
      

  2.   

    不用,加上hook后就可以对非模态对话框进行消息响应了
      

  3.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!
      

  4.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!放到ocx应用程序的cpp中或主窗口中试下
      

  5.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!放到ocx应用程序的cpp中或主窗口中试下
    我放在调用active的主程序也是一样的,没有进入到控件的on_create中去
      

  6.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!放到ocx应用程序的cpp中或主窗口中试下
    我放在调用active的主程序也是一样的,没有进入到控件的on_create中去不是,肯定要放在ActiveX里面呐,放在xxx.cpp或xxxCtrl.cpp里面,我之前的一个项目就是采取这种方式,ActiveX里面的所有非模态对话框都可以响应消息了
      

  7.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!放到ocx应用程序的cpp中或主窗口中试下
    我放在调用active的主程序也是一样的,没有进入到控件的on_create中去不是,肯定要放在ActiveX里面呐,放在xxx.cpp或xxxCtrl.cpp里面,我之前的一个项目就是采取这种方式,ActiveX里面的所有非模态对话框都可以响应消息了
    现在我的activex里面还没有创建任何窗口,activex ctrl的on_create就没办法触发了
      

  8.   

    我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!放到ocx应用程序的cpp中或主窗口中试下
    我放在调用active的主程序也是一样的,没有进入到控件的on_create中去不是,肯定要放在ActiveX里面呐,放在xxx.cpp或xxxCtrl.cpp里面,我之前的一个项目就是采取这种方式,ActiveX里面的所有非模态对话框都可以响应消息了
    现在我的activex里面还没有创建任何窗口,activex ctrl的on_create就没办法触发了不一定是OnCreate里面。。程序初始化Init时加载hook,exit里面卸载hook