如何使得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/
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(MSG* pMsg)遇到的问题--相应右键消息。隔一次响应一次,求解。
- 对话框不响应WM_KEYDOWN消息,可以通过重载BOOL PreTranslateMessage(MSG * pMsg)来实现
- PreTranslateMessage无法捕获WM_VSCROLL 滑动条添加消息响应
- VC6.0中对消息的特殊处理--PreTranslateMessage说明
- OCX控件中如何去响应WM_DRAWCLIPBOARD
- 消息流程:GetMessage()或者PeekMessage(),PreTranslateMessage,TranslateMessage,DispatchMessage
- 在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息
- Win32编程点滴之PreTranslateMessage与消息循环
- 关于VC的dialog框PreTranslateMessage不响应现象及解决办法
- 在MFC中如何使用PreTranslateMessage
- Win32编程点滴之PreTranslateMessage与消息循环
- Windows消息机制的流程及PreTranslateMessage作用和使用方法
- 在PreTranslateMessage中处理mouse move的消息,解决Picture Control设置notify为true之后与对话框OnMouseMove冲突的问题
- 请问如何响应TreeCtrl控件消息?利用ON_NOTIFY
- PreTranslateMessage 、CWND & HWND & 控件ID之间的巧妙转换方法