http://www.cppblog.com/cugdj/archive/2009/01/06/71299.html?opt=admin 


由于在DLL窗体中需要使用CToolTipCtrl来实现提示功能,
所以要重载PreTranslateMessage,代码如下

BOOL CMyWnd::PreTranslateMessage(MSG* pMsg) 
{
 m_toolTip.RelayEvent(pMsg);  
 return CGameWnd::PreTranslateMessage(pMsg);
}

但是由于CMyWnd是在DLL中,所以重载PreTranslateMessage无效,
具体原因我忘记了,反正网上都可以搜索到。不过解决方案都给的
不是很明确,在这里我把我的解决方法记录下来,省得以后忘掉了。
主要是在创建CMyWnd实例的时候把窗口指针存下来,然后使用全局
消息钩子执行CMyWnd::PreTranslateMessage,代码如下

1.定义全局变量
 HHOOK g_hHook = 0;
 CMyWnd* g_pMyWnd = NULL;

2.安装全局钩子,要在DLL中安装
 g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, HookProc, 0, ::GetCurrentThreadId());

3.创建窗体的时候保留指针
 m_pMyWnd = new CMyWnd();
 g_pMyWnd = m_pMyWnd;

4.钩子函数
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 MSG* pMsg = (MSG*)lParam;
 if(g_pMyWnd && (pMsg->hwnd == g_pMyWnd->m_hWnd))
 {
  g_pMyWnd->PreTranslateMessage(pMsg);
 }
 return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

5.退出的时候别忘了卸载钩子
 if(g_hHook) 
  UnhookWindowsHookEx(g_hHook);