如何操作“SysTabControl32”控件? 控制面板里面有很多对话框打开后,都有“SysTabControl32”选项卡控件,我想用代码选择这个选项卡的某个子卡。问题是:如何获得“SysTabControl32”控件的句柄?又如何选择子卡?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (1)用FindWindow()查找句柄,需要调用若干次,具体用SPY++看窗口层次。(2)发消息:TCM_SETCURSELhttp://msdn.microsoft.com/en-us/library/bb760612(v=vs.85).aspx 首先谢谢楼上的回答!下面是SPY++的截图:图中红圈处是选项卡.我现在执行下面的语句:hwnd =FindWindow ("#32770", "宽带连接 属性");之后可以获得窗口句柄,但是不知道后面应该怎样进一步获得选项卡句柄?有请进一步释疑,谢谢! 继续调用GetWindow() 传入 GW_CHILD TCM_SETCURSEL这个消息的值是多少啊?在哪儿能找到呢? 我现在执行下面的代码 int TCM_FIRST = 0x1300; int TCM_SETCURSEL = TCM_FIRST + 12; hwnd =FindWindow ("#32770", "宽带连接 属性"); hwnd1 = GetWindow(hwnd, GW_CHILD); SendMessage(hwnd1, TCM_SETCURSEL, 0, 0);但是选项卡没有反应,哪的问题呢? (1)调试,看看得到的Handle是否和SPY++的一致。(2)用PostMessage看看。TCM_SETCURSEL wparam 传递 Index of the tab to select. 你为什么传0? 调试发现:uint GW_CHILD = 5; hwnd = FindWindow("#32770", "宽带连接 属性"); hwnd1 = GetWindow(hwnd, GW_CHILD);得到的句柄和spy++相比,hwnd是一致的,但是hwnd1不一致,hwnd1得到的是子卡“常规”的句柄。“宽带连接 属性”的截图如下:函数GetWindow()没有返回期望的值,是函数的参数没对吗? 你可能需要多次调用GetWindow。因为不一定只有唯一的子窗口,你还可以试试EnumChildWindows 通过仔细观察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,英文能力不好,不能确认。 哦,我明白了。其实不用操作tabcontrol了,所有的控件都是有的,只是隐藏起来了,你直接再往下找,把需要的找到。取消隐藏就可以了。 “所有的控件都是有的,只是隐藏起来了”,如果只是隐藏了,用spy++能看到这些隐藏的子卡吗?隐藏的子卡用getwindows能找到吗?嗯,我试试 不行。一、通过2楼的spy++截图可以看到,如果是隐藏了,用spy++是查看不到的。二、我用GetWindow(hwnd1, GW_HWNDNEXT)可以得到spy++中显示出来的句柄,包括灰色的那两个按钮的;但是spy++中没有显示出来的其它子卡,就得不到了!似乎没办法了?! 一、通过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。搞不明白为什么!在网上搜索了一下类似问题,也没有找到答案。 不然你让 tabcontrol 获得焦点,然后发送 -> 键消息。 终于OK了!感谢caozhy的热心相助,其实你已经帮我帮到家门口了! 系统需要时间重绘的原因,这个在msdn对TCM_SETCURSEL的描述上没有提及,如果msdn能有个举例,就不会这么麻烦了!再次感谢caozhy,现在看,你的指点都是正确的! 其实没必要那么麻烦,http://dev.firnow.com/course/webjsh/osgl/20071129/89042.html或者你用一个叫 regshot 的软件对比下设置前后注册表的变化,然后用程序操纵注册表都可以的。 “regshot”?我一直在找一个这样的东东!我工作中遇到大量的需要查找注册表的事情,以前使用Inctrr5,但是很不方便,不实用。你说的这个软件我试试,太感谢你了! WPF中遍历Textbox中内容 WPF中使用WebBrowser控件时,窗口设置AllowsTransparency会有问题 C# 发送消息 求教 webservice问题 汇总与明细在datagrid中显示 关于Winform多线程问题 vc和c#我该选项哪一个呢? 我要在一个窗体中DADASET数据集传递到另一个窗体作为水晶报表数据源,怎么做到?谢谢! 吐血送分:如何在空白水晶报表上显示DataSet的数据? 在服务器端如何给连入的客户端发消息? 求C#登陆QQ网站的POST,GET方法类 我有一个类,但是不会用 KTV中歌曲置顶效果怎么做?希望能详细点,谢谢了
(2)发消息:TCM_SETCURSEL
http://msdn.microsoft.com/en-us/library/bb760612(v=vs.85).aspx
int TCM_SETCURSEL = TCM_FIRST + 12; hwnd =FindWindow ("#32770", "宽带连接 属性");
hwnd1 = GetWindow(hwnd, GW_CHILD);
SendMessage(hwnd1, TCM_SETCURSEL, 0, 0);
但是选项卡没有反应,哪的问题呢?
(2)用PostMessage看看。
TCM_SETCURSEL wparam 传递 Index of the tab to select. 你为什么传0?
uint GW_CHILD = 5;
hwnd = FindWindow("#32770", "宽带连接 属性");
hwnd1 = GetWindow(hwnd, GW_CHILD);得到的句柄和spy++相比,hwnd是一致的,但是hwnd1不一致,hwnd1得到的是子卡“常规”的句柄。“宽带连接 属性”的截图如下:函数GetWindow()没有返回期望的值,是函数的参数没对吗?
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,英文能力不好,不能确认。
一、通过2楼的spy++截图可以看到,如果是隐藏了,用spy++是查看不到的。
二、我用GetWindow(hwnd1, GW_HWNDNEXT)可以得到spy++中显示出来的句柄,包括灰色的那两个按钮的;但是spy++中没有显示出来的其它子卡,就得不到了!
似乎没办法了?!
二、SendMessage(hwnd2, TCM_SETCURSEL, 1, 0)这样做虽然通过实际调试看,对话框有反应,但是并不能让系统实例化对应的子卡,这一点似乎和MSDN的解释不一致,http://msdn.microsoft.com/en-us/library/bb760612(v=vs.85).aspx。搞不明白为什么!在网上搜索了一下类似问题,也没有找到答案。
再次感谢caozhy,现在看,你的指点都是正确的!