写了一个简单程序,工具栏里放3个按钮,按钮的onclick里就弹一个messagebox来说明哪一个按钮被按到了。用远程hook 可以获得该程序里工具栏按钮点击后的wm_command消息。然后自己用sendmessage发按钮的wm_command后也能hook到。可是界面却没有弹出messagebox!
疑问:sendmessage按钮的wm_command不会触发onclick事件吗?他们之间的关系是怎样的?mousedown,mouseup和他们的关系又如何?谢谢

解决方案 »

  1.   

    void CBtnClickDlg::OnButton1() 
    {
    MessageBox("button1 clicked");
    }void CBtnClickDlg::OnButton2() 
    {
    GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONDOWN ,0,0);
    GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONUP ,0,0);
    }
      

  2.   

    用两个消息WM_LBUTTONDOWN  和 WM_LBUTTONUP  模拟一个按钮按下操作
      

  3.   

    sendmessage的窗口是否是工具栏
      

  4.   

    不好意思来晚了,我测试了下,大家帮我分析看看。
    下面是钩子里的程序: if (pMsg->message == WM_COMMAND)
    {
    if (pMsg->lParam == (long)ghwndToolBar)
    {
    itoa(pMsg->wParam,temp,20);
    SendMessage(ghwndTEdit,WM_SETTEXT,NULL,(LPARAM)temp);
    nBbb+=100;
    }

    }程序中的测试过程是按照lingxiao66说的。sendmessage了WM_LBUTTONDOWN和WM_LBUTTONUP后,正确执行了目标按钮click函数。同时收到2次wm_command消息,也就是说,被按下的按钮和sendmessage的目标按钮的wm_command消息都产生了。to xsgluozi:
    想知道这个消息响应函数(onclick)和哪个消息绑定的。to tr0j4n:
    程序里判断过,的确是没有问题to heksn:
    是的,可以肯定。我把hook里的代码附在上面。麻烦大家再帮我想想,这个onclick到底是和哪个消息绑定了的,谢谢!
      

  5.   

    刚发现新版csdn的顶帖功能没了。。
      

  6.   

    疑问:sendmessage按钮的wm_command不会触发onclick事件吗?他们之间的关系是怎样的?mousedown,mouseup和他们的关系又如何?谢谢
    ======================
    你弄错了一个问题,WM_COMMAND消息并不是发向工具栏的,而是但用户点击按钮时,由工具栏发送出的消息,也就是说,你点击按钮,产生WM_LBUTTONDOWN之类的消息,然后工具栏向父窗口发送WM_COMMAND消息,而父窗口对这个消息做出反应。你向工具栏发WM_COMMAND有什么用呢?
      

  7.   

    不好意思,我没表达清楚,的确是给主窗口发的wm_command
    SendMessage(ghwndMainWin,WM_COMMAND,MAKEWPARAM(i,BN_CLICKED),(long)ghwndToolBar);
      

  8.   

    从上面代码上看,没有什么问题,你确定你发送的WM_COMMAND中的按钮ID没有出错?
      

  9.   

    我个人非常确定,希望自己不是盲目的。
    我还做了个实验就是把我通过点击按钮后hook得到的wm_command的msg,提取参数再次用sendmessage发出,这样理论上会出现一个死循环,测试结果是虽然没死,但是他一下子循环了35次左右。但是messagebox还是只有1个弹出。LRESULT CALLBACK HookProc2(int nCode, WPARAM wParam, LPARAM lParam)
    {
    CWPSTRUCT    *pMsg = (CWPSTRUCT    *)lParam;
    if (pMsg->message == WM_COMMAND)
    {
    if (pMsg->lParam == (long)ghwndToolBar)
    {
    SendMessage(ghwndMainWin,WM_COMMAND,pMsg->wParam,pMsg->lParam);
    nBbb+=100;
    }
    }
    }