网上找了一下,还是没有明白的答案.
   这真是个难问题吗?
   200分(BCB部分也有100).

解决方案 »

  1.   

    先获取ToolButton的范围,再模拟鼠标点击uses CommCtrl;procedure TForm1.Button1Click(Sender: TObject);
    var t:TRect;
    begin
      SendMessage(ToolBar1.Handle,TB_GETITEMRECT,0,integer(@t));//ID是0的ToolButton
      SendMessage(ToolBar1.Handle,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(t.Left,t.Top));
      SendMessage(ToolBar1.Handle,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(t.Left,t.Top));
    end;
      

  2.   

    SendMessage(ToolBar1.Handle,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(t.Left+1,t.Top+1));
    SendMessage(ToolBar1.Handle,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(t.Left+1,t.Top+1));
      

  3.   

    呵呵,每个ToolButton范围内的每个点的位置都不会重复,加1岂不多此一举?
    用鼠标模拟点击的方法不一定最好,但TB_PRESSBUTTON又不会触发点击事件
      

  4.   

    liangqingzhi(老之),
          帮忙翻译成BCB吧:
          下面这样对不对:
            RECT TBRect;  // ????        SendMessage(
                hToolBarWindow,TB_GETITEMRECT,1,(int)&TBRect);
                
            SendMessage(
                hToolBarWindow,WM_LBUTTONDOWN,
                MK_LBUTTON,MAKELPARAM( TBRect.left,TBRect.top ));
            SendMessage( hToolBarWindow,
                WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM( TBRect.left,TBRect.top
                                      )
                       );
            如果没有翻译错,还是不行:调试发现,TBRect.left的数值很大!
      

  5.   

    我用你的代码在BCB6下调试没有问题,TBRect.left很大,是不是用了第三方控件?
      

  6.   

    原程序是.net的.用VS开发的.
     我在Down和Up之间加了一个延时,原程序出现错误:
               "Object reference not set to an instance of an object.
       点"确定"后,原程序被关闭.
      

  7.   

    唉,与控件应该没关系,可能这个用鼠标模拟点击方法本来就有问题。
    我测试就用本程序的ToolBar的句柄没问题,但用到外部的ToolBar句柄就不行了。
    看看别人还有没有好的方法。
      

  8.   

    你先找到句柄,再用postmessage()发送点击消息.
      

  9.   

    我发现问题就在TB_GETITEMRECT这里,对于内部的ToolBar.handle,它能够获取正确的Rect,可以实现点击。但对于外部的ToolBar.handle,它的Rect全是0。用PostMessage也不行,TB_GETRECT也不行。
      

  10.   

    Why?
      I'm going to sleep.