我把HOOK放在了DLL中,想在HOOK到数据时PostThreadMessage给调用进程。可是没反应。DLL代码:
DWORD dwThreadID = 0; //它是全局变量
...
//Install hook
HHOOK InstallHook( DWORD dwID ) 
{
dwThreadID = dwID; g_hHook = SetWindowsHookEx( WH_GETMESSAGE, KeyboardProc, g_hInstance, 0 );
return g_hHook;
}//Record function
LRESULT 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;
}  }}

解决方案 »

  1.   

    g_hInstance为动态库的实例句柄,传入的当前线程句柄是否需要和g_hInstance进行关联?
    或者将g_hInstance替换为NULL试一下(对全部应用程序进行勾子)?
    不太懂,标记一下。
      

  2.   

    PeekMessage( &msg, NULL, WM_USER, WM_USER + 1000, PM_NOREMOVE );//这句可以注释掉吧
    有了::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 )就行了
    GetMessage第3个和第4个参数直接传NULL;
      

  3.   

    PostThreadMessage( dwThreadID, WM_CHARMSG, 0, 0 ); //不能断点,所以我也不知道有没有成功
    下面加个
    MessageBox(NULL,"postmsg","",MB_OK);//试试代码到这没有
    DLL可以被调试吧?怎么会跟踪不到?
    而且我感觉,截取键盘消息还是用DirInput的好用,貌似可以全局监视键盘,以前我做的DNF一键召唤就是用的DirInput,HOOK没用- -!
      

  4.   

    PostThreadMessage又返回值的,看看返回值就知道发成功了没
    而且按照微软的说法,这个函数应该放在while循环里面,反复发送知道发成功了为止。