求救:关于PostThreadMessage,全局钩子的问题,弄了一天都没懂(附代码)。
我建立了一个dll,在里面建立了一个全局钩子,然后创建一个单文档的界面的test工程调用该dll中的函数。
dll的导出函数如下:
__declspec(dllexport) BOOL InstallHook(DWORD nId)
{
nThreadId=nId;//test工程的主线程thread id。
if(!(hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,ghInstance,0)))
return FALSE;
return TRUE;
}
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//让其它全局钩子获得消息
LRESULT Result=CallNextHookEx(hHook,nCode,wParam,lParam);
MSG* pMsg=(MSG*)lParam;
if(pMsg->message==WM_CHAR&&wParam==PM_REMOVE)//每当收到WM_CHAR消息就向主线程传送。
{
BOOL bRet=::PostThreadMessage(nThreadId, WM_USER_CHAR, pMsg->wParam, pMsg->lParam);
。。。。。
在单文档exe中的视图安装全局钩子。
void CTestView::OnInitialUpdate()
{
CEditView::OnInitialUpdate();
InstallHook(AfxGetApp()->m_nThreadID);
}
在主线程CTestApp中:
。。。。。
ON_THREAD_MESSAGE(WM_USER_CHAR,OnCharMsg)
END_MESSAGE_MAP()
。。。。。
HRESULT CTestApp::OnCharMsg(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox("Received");
CFrameWnd* pFrame=((CFrameWnd*)m_pMainWnd);
CTestView* pView=(CTestView*)pFrame->GetActiveView();
pView->SendMessage(WM_CHAR,wParam, lParam);
return 0;
}
运行test程序一切ok:在单文档中输入的字符CTestApp::OnCharMsg均可接受到。但是如果将界面切换到别的应用程序的窗口,::PostThreadMessage(nThreadId, WM_USER_CHAR, pMsg->wParam, pMsg->lParam);返回FALSE,Test没有接受到任何消息。请问这是为什么?难道将test的主窗口切换到别的窗口CTestApp的Message Quene就没有了吗?CTestApp::Run应该还是一直调用PeekMessage在监视啊?