手头上有个三方程序,使用的是TPageControl,上面有几个TabSheet,我现在想用vc写个程序来自动在sheet 0和sheet 2之间切换。另外,sheet 0上有两个button,需要给这两个button发送BM_CLICK消息。现在碰到两个问题:1)在sheet 0和sheet 2之间切换的时候,有时候无法从sheet 2切换到sheet 0。我的切换程序如下:HWND CMyClass::FindTPageControl()
{
//这一段代码使用spy4win生成的代码,用来查找TPageControl。
//代码略
}//这个函数用于切换sheet,直接给TPageControl的父窗口发送鼠标消息,尝试用过NMHDR notify,但是老出错,因此改用直接给父窗口发送鼠标消息。
void CMyClass::ChangePageIdx(HWND hPage, int Value)
{
HWND hParent = ::GetParent(hPage);
CRect rcParent;
::GetWindowRect(hParent, &rcParent);
CPoint pt0(rcParent.left+60, rcParent.top+40);
::ScreenToClient(hPage, &pt0);
        ::SendMessage(hPage, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(pt0.x, pt0.y));
}调用如下:HWND hPage=FindTPageControl();
ChangePageIdx(hPage,0);根据我的debug log,程序都已经运行到SendMessage了,坐标点也都是正确的,但是就是无法切换。2)给sheet 0上的button发送BM_Click消息时,有时候也发送失败,代码如下:HWND FindButtonWindow()
{
  //这里使用spy4win生成的代码;代码略
}调用代码如下:HWND hwnd=FindButtonWindow();
SendMessage(hWnd,BM_CLICK,0,0);根据我的debug log,hwnd都已经被找到了,就是发送消息这个函数出了问题。请高手帮忙。是不是要activewindows先啊?如何确保每次消息都能发送成功呢?

解决方案 »

  1.   

    很久以前偶回的一个贴子:
    http://topic.csdn.net/u/20070701/17/59ebaac2-9ca5-4cc3-93e0-54b9fc8b5ff7.html?397066827
      

  2.   

    我用了你的方法了,窗口可以切换。我手头上的三方程序是一个串口通信程序,用你的方法切换sheet的时候,该程序老是弹出串口通信错误的对话框,没办法就换成直接发送鼠标消息的方法了。
    能不能帮忙看看上述代码能实现吗?或者有什么问题?谢谢
      

  3.   

    对了,该第三方程序的窗口父子关系是:TForm1-->TPageControl-->TTabSheet
      

  4.   

    这个错误应该是那个软件在页面切换时有一个事件触发导致的出错,你直接用鼠标切换会不会出这个错误?
    如果鼠标切换不出错的话,嗯~~,我那个代码里其实还少了一个TCN_SELCHANGING的NOTIFY消息,你把这个也加上试试先(应该在在TCM_SETCURSEL之前)。
    你也可以试试直接发鼠标消息控制,通过TabCtrl_GetItemRect可以得到页标题的位置大小,然后向它发WM_LBUTTONDOWN和WM_LBUTTONUP试试(当然,用mouse_event也好)。