您的位置:首页 > 其它

如何使得OCX控件能响应PreTranslateMessage消息?

2011-06-16 17:48 429 查看
1、首先在OCX的CPP文件中声明一个全局变量:
static HHOOK hHook = NULL;
2、定义VHook处理函数:
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)){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);}
3、在OCX的“OnCreate”中添加如下代码:// Because ActiveX control is an inproc server, it does not have a// message pump. So, messages to child windows created by the// ActiveX control are not going to be received by the control.// Thus, we set up a message hook to call PreTranslateMessage().// This results in the call to FilterToolTipMessage(), which// activates tooltips.hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, AfxGetInstanceHandle(),GetCurrentThreadId());
4、释放资源,在OCX的“OnDestroy”消息中添加如下代码: VERIFY(::UnhookWindowsHookEx(hHook));
参考:http://support.microsoft.com/kb/233263/en-us/http://support.microsoft.com/kb/168777/en-us/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: