如下代码,我想为一个指定名字的窗口加上一个钩子钩子代码如下,能够成功调用到DLL中的钩子函数,但却不起作用,如果设为全局就有效,指定了线程ID就无效...#include <windows.h>HHOOK g_hMouse=NULL;LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==WM_LBUTTONDOWN)MessageBox(NULL,"YES","",MB_OK);
return 1;
}void SetHook()
{
HWND gameh=::FindWindow(NULL,"testdig");//其中"testdig"为空白的对话框的标题名
//获取窗口进程ID

DWORD processid; processid=::GetWindowThreadProcessId(gameh,NULL); g_hMouse=SetWindowsHookEx(WH_CALLWNDPROC,MouseProc,GetModuleHandle("Hook"),processid);}

解决方案 »

  1.   

    看MSDN上的一句话:
    An error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process. 要同一个进程所创建的线程
      

  2.   

    解决了,查阅了一个下午processid=::GetWindowThreadProcessId(gameh,&processid);这样子才能正确的利用该线程ID进行挂钩...
      

  3.   

    求救,此鼠标消息的过程函数中,lParam的低位和高位为鼠标发出消息时的地址?为何我每次点击时,其值都是不变的,而且其值错得挺离谱??
      

  4.   

    你用的是DLL吗?? 如果访问的不是本进程的指针 会失败。。
      

  5.   


    恩,是的,我用的是DLL那如果是同一进程的,lParam里面的高低位就不会错么?
    还有,为什么每次点击时的坐标点都一样的?
      

  6.   

    LRESULT   CALLBACK   MouseProc(int   code,   WPARAM   wParam,   LPARAM   lParam) 

    LONG   x,y; 
    char   sz[100]; 
    MOUSEHOOKSTRUCT   *msdt=(MOUSEHOOKSTRUCT   FAR   *)lParam; x=msdt-> pt.x; 
    y=msdt-> pt.y; 
    _ltoa(x,sz,16); 
    MessageBox(NULL,sz, "data: ",MB_OK);   
    return   CallNextHookEx(hhook,   code,   wParam,   lParam); 

    lParam 存放的是一个MOUSEHOOKSTRUCT 结构体,可以查msdn,这个结构体得到坐标
      

  7.   

    当我在LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)函数中把lParam消息发送到接受消息的主窗口的时候,发觉好像lParam的生命周期结束了...因为在接收窗口那边,该指针里面的内容已经没有了....怎么办
      

  8.   

    直接传递 X和Y坐标,,压缩进Wpram 里 这样不会出错,不能传指针,
      

  9.   

    如何压缩进去wParam呢?PS:谢谢你近来的关注和帮忙。
      

  10.   

    添加 进lParam 
    lParam =MAKELONG(x,y);
    取出
    x=LOWORD (lParam ) ;
    y=HIWORD (lParam ) ;