问题背景:
我有一个任务,需要多个(共7个)软件的配合才能完成。我没有这些软件的源代码。
现在我想创建一个新的程序对原有的这些软件进行控制,以达到自动完成任务的目的。
目前的情况是前6个软件都已能够控制,第7个软件确无法对其进行准确的操作。
主要原因是其中存在一个类型为SysTreeView32的控件,我需要在这个控件中增加子结点,以完成任务。原有方案:
1.利用VC6创建一个新的Win32应用程序,暂称为主程序。
2.利用第7个程序文件,在主程序中创建一个新的进程。
3.在主程序中查找SysTreeView32的窗口句柄。
4.利用得到的窗口句柄对其进行控制。我的问题:
1.有什么办法能够准确地获得程序7中的SysTreeView32控件的窗口句柄?所谓“准确”,是指能够一定找到这个控件,且只找到我所需要的那个控件。
2.我需要选中SysTreeView32控件中的某个子结点,那么,在主程序中应该如何实现这样的目的。

解决方案 »

  1.   


    1.
    spy++ 查看你需要的 SysTreeView32 控件的 "control ID" xctrlID
    hTree = ::GetDlgItem(hDlg, xctrlID) 就得到了 , hDlg是控件的父窗口hwnd2.
    使用 TreeView_SelectItem 宏 或者 给 hTree 发送 TVM_SELECTITEM 消息
      

  2.   

    FindWindow等找到对应的SysTreeView控件,可以用Spy++查看一下对应的窗口名和类名找到hwnd后,就可以发送对应的一些控制消息了
      

  3.   

    OK,已经成功实现了。谢谢!!!代码如下:
    hFrameWnd = GetDlgItem(MyApp.GetTopWnd(),0xE900);//查询AfxMDIFrame42s类型窗口
    hTreeViewWnd = GetDlgItem(hFrameWnd,0xE900);//查询SysTreeView32类型窗口(hFrameWnd的子窗口)hTreeRoot = (HWND)SendMessage(hTreeViewWnd,TVM_GETNEXTITEM,TVGN_ROOT, 0x0);//查询根结点
    hThisWnd = (HWND)SendMessage(hTreeViewWnd, TVM_GETNEXTITEM,TVGN_NEXTVISIBLE, 
                                (long)hTreeRoot);//查询下一个结点的窗口句柄
    SendMessage(hTreeViewWnd, TVM_SELECTITEM,TVGN_CARET, (long)hThisWnd);//选中当前结点