一个程序的主窗口有一个子控件,子控件上有个按钮,如果用SPY++直接监听主窗口的消息时监听不到WM_COMMAND消息,如果监听子控件的WM_COMMAND时,就监听到了下面的消息,为什么我怎么也HOOK不到这个消息啊,DLL已经注入进去了用了WH_GETMESSAGE ,WH_CALLWNDPROC都拦截不到,请问该怎么办啊
<00001> 00011600 P WM_COMMAND WNOTIFYCOD :0 (send form a menu) wID:2187用以下的代码
pidg:= GetWindowThreadProcessId(htable, nil);  //htable就是子控件的句柄
  khook:=SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProc,hInstance,pidg);   //WM_GETMESSAGE也不行,pidg改成0也不行,为什么SPY++就行啊?

解决方案 »

  1.   

    你會發現用delphi自帶winsight32也無法攔截到子控件的wm_command。
    可以去攔截 該控件的容器控件,或者說 父控件。通過判斷 參數,來確定是否 為指定的子控件
      

  2.   

    hook是監視 線程的消息隊列。WM_Command不會經過消息隊列。通過子類化 子控件 可解決你的問題。
      

  3.   

    子類化 demoOldProc:=FARPROC(GetWindowLong(handle,GWL_WNDPROC)); //先記下原先的窗口過程
    SetWindowLong(handle,GWL_WNDPROC,Longint(@WinProc));//handle為子控件的handle //============================================================================Function WinProc(Hwnd,Msg,wParam,lParam:longint):LRESULT; stdcall; 
    begin 
    case Msg of 
        WM_COMMAND:
           ....
      end; 
      Result:=CallWindowProc(OldProc,Hwnd,Msg,wParam,lParam); 
    end; 
      

  4.   

    可是我拦截任务拦上的开始按钮就正常啊
    代码放在哪啊?DLL里吗?
      

  5.   

    我试了下设成全局的可以拦截到所有的窗口但是我想拦截的那个程序窗口还是拦截不到,SPY++是怎么做的啊?
      

  6.   

    SPY++ 應該是象我說的:指定窗口後,獲取窗口句柄,子類化 窗口
      

  7.   

    一个程序有两个子窗口,我想分别用sethook(窗口1) sethook(窗口2) 注入DLL,能这样用吗?
      

  8.   

    若不是通过子类化的方式,去拦截消息,同样拦截不到wm_command