控制面板里面有很多对话框打开后,都有“SysTabControl32”选项卡控件,我想用代码选择这个选项卡的某个子卡。问题是:如何获得“SysTabControl32”控件的句柄?又如何选择子卡?
谢谢!

解决方案 »

  1.   

    (1)用FindWindow()查找句柄,需要调用若干次,具体用SPY++看窗口层次。
    (2)发消息:TCM_SETCURSEL
    http://msdn.microsoft.com/en-us/library/bb760612(v=vs.85).aspx
      

  2.   

    首先谢谢楼上的回答!下面是SPY++的截图:图中红圈处是选项卡.我现在执行下面的语句:hwnd =FindWindow ("#32770", "宽带连接 属性");之后可以获得窗口句柄,但是不知道后面应该怎样进一步获得选项卡句柄?有请进一步释疑,谢谢!
      

  3.   

    继续调用GetWindow() 传入 GW_CHILD
      

  4.   

    TCM_SETCURSEL这个消息的值是多少啊?在哪儿能找到呢?
      

  5.   

    我现在执行下面的代码            int TCM_FIRST = 0x1300;
                int TCM_SETCURSEL = TCM_FIRST + 12;            hwnd =FindWindow ("#32770", "宽带连接 属性");
                hwnd1 = GetWindow(hwnd, GW_CHILD);
                SendMessage(hwnd1, TCM_SETCURSEL, 0, 0);
    但是选项卡没有反应,哪的问题呢?
      

  6.   

    (1)调试,看看得到的Handle是否和SPY++的一致。
    (2)用PostMessage看看。
    TCM_SETCURSEL wparam 传递 Index of the tab to select. 你为什么传0?
      

  7.   

    调试发现:
    uint GW_CHILD = 5;
             hwnd = FindWindow("#32770", "宽带连接 属性");
             hwnd1 = GetWindow(hwnd, GW_CHILD);得到的句柄和spy++相比,hwnd是一致的,但是hwnd1不一致,hwnd1得到的是子卡“常规”的句柄。“宽带连接 属性”的截图如下:函数GetWindow()没有返回期望的值,是函数的参数没对吗?
      

  8.   

    你可能需要多次调用GetWindow。因为不一定只有唯一的子窗口,你还可以试试EnumChildWindows
      

  9.   

    通过仔细观察spy++中的对象的层次,语句改成下面的方式:
    hwnd = FindWindow("#32770", "宽带连接 属性");
                hwnd1 = GetWindow(hwnd, GW_CHILD);
                hwnd2 = GetWindow(hwnd1, GW_HWNDLAST );
                int TCM_SETCURSEL = TCM_FIRST + 12;
                SendMessage(hwnd2, TCM_SETCURSEL, 1, 0);//参数“1”对应选中子卡“选项”
    终于可以选中子卡"选项"了,但是还有新的问题。下图是用代码选中子卡“选项”后的截图:对比下面的,由鼠标选中的子卡“选项”后的截图:发现二者效果并不相同。打开spy++查看,果然并没有出现子卡“选项”的句柄!
    是否发送TCM_SETCURSEL给控件SysTabControl32,并不能等效于鼠标点击呢?再去看msdn,英文能力不好,不能确认。
      

  10.   

    哦,我明白了。其实不用操作tabcontrol了,所有的控件都是有的,只是隐藏起来了,你直接再往下找,把需要的找到。取消隐藏就可以了。
      

  11.   

    “所有的控件都是有的,只是隐藏起来了”,如果只是隐藏了,用spy++能看到这些隐藏的子卡吗?隐藏的子卡用getwindows能找到吗?嗯,我试试
      

  12.   

    不行。
    一、通过2楼的spy++截图可以看到,如果是隐藏了,用spy++是查看不到的。
    二、我用GetWindow(hwnd1, GW_HWNDNEXT)可以得到spy++中显示出来的句柄,包括灰色的那两个按钮的;但是spy++中没有显示出来的其它子卡,就得不到了!
    似乎没办法了?!
      

  13.   

    一、通过spy++可以知道,在打开“宽带连接 属性”对话框后,只有子卡“常规”是有句柄的,其它的子卡都没有;当用鼠标点击选择某个子卡后,这个子卡在spy++中就会出现句柄,也就可以被getwindows获取到。这说明getwindows只能获取到“通过spy++能看到的那些对象”的句柄,而spy++看不到的那些对象,估计系统还没有为其分配内存,即没有实例化,当然也就获取不到句柄了.
    二、SendMessage(hwnd2, TCM_SETCURSEL, 1, 0)这样做虽然通过实际调试看,对话框有反应,但是并不能让系统实例化对应的子卡,这一点似乎和MSDN的解释不一致,http://msdn.microsoft.com/en-us/library/bb760612(v=vs.85).aspx。搞不明白为什么!在网上搜索了一下类似问题,也没有找到答案。
      

  14.   

    不然你让 tabcontrol 获得焦点,然后发送 -> 键消息。
      

  15.   

    终于OK了!感谢caozhy的热心相助,其实你已经帮我帮到家门口了!
      

  16.   

    系统需要时间重绘的原因,这个在msdn对TCM_SETCURSEL的描述上没有提及,如果msdn能有个举例,就不会这么麻烦了!
    再次感谢caozhy,现在看,你的指点都是正确的!
      

  17.   

    其实没必要那么麻烦,http://dev.firnow.com/course/webjsh/osgl/20071129/89042.html或者你用一个叫 regshot 的软件对比下设置前后注册表的变化,然后用程序操纵注册表都可以的。
      

  18.   

    “regshot”?我一直在找一个这样的东东!我工作中遇到大量的需要查找注册表的事情,以前使用Inctrr5,但是很不方便,不实用。你说的这个软件我试试,太感谢你了!