如何使得OCX控件能响应PreTranslateMessage消息?
2010-12-01 11:06
381 查看
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/
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/
相关文章推荐
- 如何使得OCX控件能响应PreTranslateMessage消息?
- 如何使得OCX控件能响应PreTranslateMessage消息?
- 使得OCX控件响应PreTranslateMessage消息的步骤
- 使得OCX控件响应PreTranslateMessage消息的步骤
- OCX控件响应PreTranslateMessage消息的步骤
- PreTranslateMessage无法捕获WM_VSCROLL 滑动条添加消息响应
- 对话框不响应WM_KEYDOWN消息,可以通过重载BOOL PreTranslateMessage(MSG * pMsg)来实现
- 重写PreTranslateMessage(MSG* pMsg)遇到的问题--相应右键消息。隔一次响应一次,求解。
- PreTranslateMessage()函数捕获键盘按键消息
- MFC消息截获之pretranslatemessage
- 如何让自定义的基于CStatic的控件响应鼠标移动的消息
- 用PreTranslateMessage使dialog接收消息
- Windows消息机制的流程及PreTranslateMessage作用和使用方法
- pretranslatemessage 不响应
- MFC DLL PreTranslateMessage 导致的快捷键不响应的问题?
- 让MFC DLL 中的窗口响应PreTranslateMessage
- 在MFC中手动添加消息处理函数PreTranslateMessage
- OCX中通过HOOK来实现PreTranslateMessage
- PreTranslateMessage是消息
- PreTranslateMessage截获子窗口的消息