这个钩子为什么钩不住指定线程的消息呢?
钩子为DLL~
RPStartMessageHook接收的是一个程序得线程ID~如果我想只对用户自定义的消息做操作~在GetMessageProc里面怎么判断?
如果我想更改这个消息传递的数据可以吗?DLL程序全文~~
// hook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif#pragma data_seg("PublicData") 
HHOOK hhook=NULL;            
HINSTANCE pInstance = NULL; 
UINT Point=0;
#pragma data_seg() 
#pragma comment(linker,"/section:PublicData,rws")static AFX_EXTENSION_MODULE HookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("HOOK.DLL Initializing!\n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(HookDLL, hInstance))
return 0; new CDynLinkLibrary(HookDLL);
pInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("HOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(HookDLL);
}
return 1;   // ok
}LRESULT WINAPI CALLBACK GetMessageProc(int code,WPARAM wParam,LPARAM lParam) 

CWPSTRUCT msg;
memcpy(&msg,(void *)lParam,sizeof(CWPSTRUCT));
return CallNextHookEx(hhook, code, wParam,lParam); 
} extern "C" _declspec(dllexport) BOOL WINAPI RPStartMessageHook(DWORD ThreadID) 

hhook=SetWindowsHookEx(WH_GETMESSAGE,GetMessageProc,pInstance,ThreadID); 
if(hhook!=NULL) 
return TRUE; 
else 
return FALSE; 
} extern "C" _declspec(dllexport) BOOL WINAPI RPStopMessageHook() 

if (hhook!=NULL)
return UnhookWindowsHookEx(hhook); 
return true;
} extern "C" _declspec(dllexport) int WINAPI RPGetMessageResult() 

return Point; 
}

解决方案 »

  1.   

    LRESULT WINAPI CALLBACK GetMessageProc(int code,WPARAM wParam,LPARAM lParam) 

    CWPSTRUCT msg;
    memcpy(&msg,(void *)lParam,sizeof(CWPSTRUCT));
             //MessageBox,这里加个MESSAGEBOX看看
    return CallNextHookEx(hhook, code, wParam,lParam); 

      

  2.   

    请注意以下点:
    一、pInstance 是否是你所要钩取的进程的句柄,你的程序中表明你的钩子的调用程序和你所要钩取的程序不是一个的话就不能成功。
    二、你所要钩取的线程句柄是否正确.如果是多线程的程序这个比较容易出现问题。
      

  3.   


    gohappy_1999(碧水蓝天) :
    谢谢回答~~用messagebox能显示出来了~guxingfeiyu(孤星飞雨) :
    谢谢回答~~那些都没有问题~~vc_asm(哥俩好):
    ........当~~这个这个~~~~~你被评为本贴最家创意回帖~~谁来回答我的其他问题呢??
    如果我想只对用户自定义的消息做操作~在GetMessageProc里面怎么判断?比如WM_USER + 400这个消息~~~
    如果我想更改这个消息传递的数据可以吗?
      

  4.   

    LRESULT WINAPI CALLBACK GetMessageProc(int code,WPARAM wParam,LPARAM lParam) 
    参数lParam里存放的就是一个MSG结构的数据,可以这样转换一下:MSG * pMsg = (MSG*)lParam;
    pMsg.message 就是当前要处理的消息, 至于这个结构里面的其他成员的意义你可以查看msdn,另外能不能该得要看code的值, 对于用户自定义的消息来说应该是可以修改的只要你能保证正确的使用他们即可.
      

  5.   

    edrftgyh(老胡):
    您好 我是用您说的pMsg.message==(WM_USER + 400)来拦截我另外程序WM_USER + 400消息,但是拦截不了。不知道为什么~~