发消息用SendMessage()或PostMessage()调试钩子DLL可以用间接方法:把各运行点的环境输出到文件或MessageBox上。

解决方案 »

  1.   

    sendmessage()不行啊!窗口句炳到是传得过来,可程序无反应
      

  2.   

    用spy看了一下,根本就没消息,用GetlastError()得到,知HWnd是一个Invalid window handle.呵呵。。,请高手指点
      

  3.   

    你的问题描述的不清楚 !
    你的 window handle 是如何传进来的 ?
    无效的 HWnd , 你怎么传的 ?如果你的 hook dll 与 hwnd 在同一进程,
    SendMessage(), PostMessage(),都没有问题,
    如果在不同的进程中,
    可用 SendMessage(hWnd, WM_COPYDATA, wParam, lParam)
      

  4.   

    经过分析,HWnd 传进来了,错在SendMessage(),dll与exe不在同一进程,
    你说的我也考虑过,但钩子dll无hWnd,怎么传?
    请教!
      

  5.   

    你可以定义exe程序主窗口的类名,在hook dll里面用FindWindow()根据类名得到窗口句柄,这样比较可靠,然后用PostMessage()函数发送消息,不要用SendMessage(),你在exe文件里面响应该消息,我以前也做过类似的程序。另外,MSDN上面也有一个SDK SPY的例子。
      

  6.   

    你最好用内存映射文件这样使得dll和Exe可以共享数据,否则你用SendMessage 或 PostMessage是无法传送数据,因为一个进程是无法访问另一个进程的数据的(32bit下是如此),除非你用的是16Bit代码!
      

  7.   

    hook的hWnd可用GetModuleHandle("Hook.dll")得到的,你将Exe的窗口句柄放在内存映射文件就可以啦
      

  8.   

    to::killjapan05
    如你所说,你的 hook 是全局 hook dll,
    发送消息,只有 WM_COPYDATA 一个消息可用,
    而且必须用 SendMessage(hWnd, WM_COPYDATA, w, l)
    不能用 PostMessage(hWnd, WM_COPYDATA, w, l)
    跨进程的数据通信,当然有多种方法,
    如,共享内存,命名管道,内存映射文件,等等
    但即发送消息,又传数据,WM_COPYDATA 消息就够用了,
    你仔细研究一下这个消息的说明吧。
    你要知道,全局 hook dll 总是在不同的进程中运行 !!!!
    用 WM_COPYDATA 消息是最好的。还有一个重要的问题必须要做,
    window handle 必须放在 hook dll 的一个全局共享数据节中,!
    否则 window 收不到消息,你自己要保证 hWnd 正确。
    代码如下所示:#pragma data_seg("GlobalSharedDataSection")
    HWND g_hTargetWnd = NULL; // must be init to NULL !!
    #pragma data_seg()#pragma comment(linker,"/SECTION:GlobalSharedDataSection,rws")
    注意:#pragma comment(linker,"/SECTION:GlobalSharedDataSection,rws") 语句中,
    ,:这两个符号后面不要有空格,原因我不清楚 !
    当初,我作 global mouse hook 的时候,调试了两天才发现这个问题,
    我至今也不明白,为什么不能加空格 !我用的环境是 VC5,
    如果你搞清楚了这个问题,烦劳,一定告诉我一下,Thanks.good luck for u.
      

  9.   

    to northwestwolf:
    我也正做一个 gmh 可是钩子好象只能在装入DLL的进程中使用 静装动装都用了 而且调用SetWindowsHookEx 时如果ThreadId=0时失败 非得用GetCurrentThreadId 我以前写过一个GKH运行起来很正常