为什么我在DLL中用PostThreadMessage给进程发消息总是不成功?
我把HOOK放在了DLL中,想在HOOK到数据时PostThreadMessage给调用进程。可是没反应。
- C/C++ code
DLL代码:DWORD dwThreadID = 0; //它是全局变量...//Install hookHHOOK InstallHook( DWORD dwID ) { dwThreadID = dwID; g_hHook = SetWindowsHookEx( WH_GETMESSAGE, KeyboardProc, g_hInstance, 0 ); return g_hHook;}//Record functionLRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ){ if ( nCode < 0 ) return CallNextHookEx( g_hHook, nCode, wParam, lParam ); //if action if ( HC_ACTION == nCode ) { MSG *pMsg = (MSG *)lParam; if ( WM_IME_COMPOSITION == pMsg->message ) { if ( pMsg->lParam & GCS_RESULTSTR ) { PostThreadMessage( dwThreadID, WM_CHARMSG, 0, 0 ); //不能断点,所以我也不知道有没有成功 } } } return CallNextHookEx( g_hHook, nCode, wParam, lParam );}EXE代码:void CTestDlg::OnBnClickedStart(){ PeekMessage( &msg, NULL, WM_USER, WM_USER + 1000, PM_NOREMOVE ); InstallHook( GetCurrentThreadId() ); while ( ::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 ) ) { switch(msg.message) { case WM_CHARMSG: AfxMessageBox( "收到" ); break; } }}[解决办法]
PeekMessage( &msg, NULL, WM_USER, WM_USER + 1000, PM_NOREMOVE );//这句可以注释掉吧
有了::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 )就行了
GetMessage第3个和第4个参数直接传NULL;
[解决办法]
PostThreadMessage( dwThreadID, WM_CHARMSG, 0, 0 ); //不能断点,所以我也不知道有没有成功
下面加个
MessageBox(NULL,"postmsg","",MB_OK);//试试代码到这没有
DLL可以被调试吧?怎么会跟踪不到?
而且我感觉,截取键盘消息还是用DirInput的好用,貌似可以全局监视键盘,以前我做的DNF一键召唤就是用的DirInput,HOOK没用- -!