本人无聊时写程序玩,在程序中用CreateWindow在桌面的句柄上建立一个按钮,发现按钮的确出现在桌面上,但发现那个按钮的消息都无法捕捉,不时说窗口的消息都是由Windows发到窗口建立线程的消息队列中的吗?但为什么在建立按钮的程序收不到消息呢?

解决方案 »

  1.   

    Because the Messages to a BUTTON is usually WM_COMMAND,which is a notify type
    message that is sent to the BUTTON's parent Window.
    So the Messages sent from your newly created BUTTON is directed to the Desktop
    Window,not your Application's window!
    Then 那个按钮的消息都无法捕捉!
      

  2.   

    谢谢,这个我是知道的,我想捕捉的是按钮的其他消息,再说我用的是一个CButton的继承类,BN_Click反射了WM_COMMAND,但结果还是一无所获。
      

  3.   

    I try to hook the WM_COMMAND message in the below however I failed to do it!
    Hehe! Os don't let you change it simply!LRESULT CALLBACK ButtonProc(HWND hWnd, UINT nMsg, WPARAM w, LPARAM l)
    {
    if(nMsg=WM_COMMAND)
            ::MessageBox(NULL,"Button Clicked","",MB_OK);
    return S_OK;
    }
    //Message Box not called
    LRESULT CALLBACK HookedProc(HWND hWnd, UINT nMsg, WPARAM w, LPARAM l)
    {
    static BOOL bFirst=TRUE;
    if(bFirst)
    {
     ::MessageBox(NULL,"Button Clicked","",MB_OK);
     bFirst=FALSE;
    }
    if(nMsg=WM_COMMAND )
    {
            ::MessageBox(NULL,"Button Clicked","",MB_OK); }
    return ::CallWindowProc((WNDPROC )g__oldProc,hWnd,nMsg,w,l);
    }
    //Button created on the Desktop Window!
    //0x1007A is Desktop window (Just for simple now)
    void CAaaaaaaaaDlg::OnButton1() 
    {   HWND hWnd= CreateWindow("BUTTON","Btn1",WS_CHILD|WS_VISIBLE,220,220,30,30,(HWND)0x1007A,(HMENU)100,NULL,NULL);
       g__oldProc=::GetWindowLong((HWND)0x1007A,GWL_WNDPROC);
       SetWindowLong((HWND)0x1007A,GWL_WNDPROC,(long)HookedProc);
    }
      

  4.   

    You should use System Hooks to add your handler for the Button!
      

  5.   

    我觉得用全局钩子应该没问题,但为什么windows不把按钮的消息发送给创建线程呢?????????
    后来我用spy++跟踪了主窗口的消息,发现在那个桌面按钮上发生消息时,主窗口收到了
    WM_KICKIDLE的消息,不知为什么?