由于在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);
posted on 2009-01-06 10:24
小四 閱讀(1966)
評論(1) 編輯 收藏 引用 所屬分類:
算法與數據結構