我在其他exe的窗口上创建了一个button并设置了它的wndproc
但是该wndproc总是收不到WM_COMMAND消息 
请问是为什么?(C++ Win32SDK)回调函数的代码(可以被顺利调用)
LRESULT CALLBACK MyProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
SendMessage(hwndMain,message,wParam,lParam);
if (message==WM_KEYDOWN)
MessageBox(NULL, "button command","ABC",MB_OK);
return CallWindowProc((WNDPROC)buttonproc,hwndMy,message,wParam,lParam);
//switch(message)
//{
//case WM_COMMAND:
// break;

// }}创建button的代码
hwndMy=CreateWindow( "BUTTON","OK", WS_CHILD|WS_VISIBLE ,pt.x, pt.y , (pt1.x-pt.x)   , (pt1.y-pt.y)   ,hwndWF,(HMENU)IDB_MYBUTTON,NULL,NULL);
buttonproc=GetWindowLong(hwndMy,GWL_WNDPROC);
SetWindowLong(hwndMy,GWL_WNDPROC,(long)MyProc);

解决方案 »

  1.   

    ::PostMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
    ::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
      

  2.   

    you can set WH_CALLWND hook, then you can monitor wndproc for other process.
    //my code example
    #pragma data_seg(".SHARDAT")
    static HHOOK callwndHook=NULL;
    #pragma data_seg()
    HINSTANCE hins;
    callwndHook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,0);
    LRESULT __declspec(dllexport)__stdcall  CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;

    if(nCode>=0 && pcw && pcw->hwnd)
    {
    if(pcw->message==WM_COMMAND)
             {
                   HWND hwnd=(HWND)pcw->wParam;//you get it now            ...  
              }
    }
      

  3.   

    you can set WH_CALLWND hook, then you can monitor wndproc for other process.
    //my code example
    #pragma data_seg(".SHARDAT")
    static HHOOK callwndHook=NULL;
    #pragma data_seg()
    HINSTANCE hins;
    callwndHook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,0);
    LRESULT __declspec(dllexport)__stdcall  CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;

    if(nCode>=0 && pcw && pcw->hwnd)
    {
    if(pcw->message==WM_COMMAND)
             {
                   HWND hwnd=(HWND)pcw->wParam;//you get it now            ...  
              }
    }
      

  4.   

    你的myproc有点问题,好象直接返回了。
      

  5.   

    用message hook可以解决。如果按你的方法,你要知道wm_command是发给按钮的父窗口的。按钮的窗口过程是收不到wm_command的。
      

  6.   

    不是一个进程吧??
    GetWindowLong()返回的是NULL!!!
    他的进程空间不等与你的进程空间!反过来也一样,windows返回NULL是有道理的!!,你调用SetWindowLong()一定会返回NULL!!.
    你看一下侯捷的win95-a-developers-guide.pdf。
      

  7.   

    用message hook可以解决。如果按你的方法,你要知道wm_command是发给按钮的父窗口的。按钮的窗口过程是收不到wm_command的。
      

  8.   

    wistaria(听风听雨) 的方法正确!前提是你要取得要控制那个窗口的hWnd,
    可以用HWND hWnd=::FindWindow(_T(""),_T("windowname"));
    得到
      

  9.   

    wndproc是取到的,
    不是一个进程,
    我现在用替换wndproc的方法搞好了
    没用hook
    谢谢大家
    马上结贴