怎么切换TabCtrol的当前页(有点挑战,希望会的朋友不吝赐教)! 本帖最后由 llsus 于 2012-08-13 16:37:30 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SendMessage 这个可以实现 系统API不过前提都是要有窗体 SendMessage 怎么实现?我WM_SETFOCUS 试过,失败了,可能用错了方法。应该用哪个消息?不能使用鼠标消息,因为程序A点击TabPage的标题,会执行事件,我不希望事件被执行,只想切换页面。 可以使用custom message, 自己定义事件,自己处理,这个事件id要定义大一点,不能跟系统事件重复。 http://www.cnblogs.com/kevinGao/archive/2011/10/30/2231524.html这里有个帖子然后你可以在需要切换tab页的界面调用切换页面事件模拟传入参数。定义一个变量或者判断sender参数是否为空 在事件里面判断然后判断是否执行该方法 Tab控件有标准的Windows消息可以操作 using System;using System.Diagnostics;using System.Runtime.InteropServices;using System.Text;namespace Text{ public class Program { [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern UInt32 SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam); public const UInt32 TCM_FIRST = 0x1300; public const UInt32 TCM_GETIMAGELIST = (TCM_FIRST + 2); public const UInt32 TCM_SETIMAGELIST = (TCM_FIRST + 3); public const UInt32 TCM_GETITEMCOUNT = (TCM_FIRST + 4); public const UInt32 TCM_GETITEMA = (TCM_FIRST + 5); public const UInt32 TCM_GETITEMW = (TCM_FIRST + 60); public const UInt32 TCM_SETITEMA = (TCM_FIRST + 6); public const UInt32 TCM_SETITEMW = (TCM_FIRST + 61); public const UInt32 TCM_INSERTITEMA = (TCM_FIRST + 7); public const UInt32 TCM_INSERTITEMW = (TCM_FIRST + 62); public const UInt32 TCM_DELETEITEM = (TCM_FIRST + 8); public const UInt32 TCM_DELETEALLITEMS = (TCM_FIRST + 9); public const UInt32 TCM_GETITEMRECT = (TCM_FIRST + 10); public const UInt32 TCM_GETCURSEL = (TCM_FIRST + 11); public const UInt32 TCM_SETCURSEL = (TCM_FIRST + 12); public const UInt32 TCM_HITTEST = (TCM_FIRST + 13); public const UInt32 TCM_SETITEMEXTRA = (TCM_FIRST + 14); public const UInt32 TCM_ADJUSTRECT = (TCM_FIRST + 40); public const UInt32 TCM_SETITEMSIZE = (TCM_FIRST + 41); public const UInt32 TCM_REMOVEIMAGE = (TCM_FIRST + 42); public const UInt32 TCM_SETPADDING = (TCM_FIRST + 43); public const UInt32 TCM_GETROWCOUNT = (TCM_FIRST + 44); public const UInt32 TCM_GETCURFOCUS = (TCM_FIRST + 47); public const UInt32 TCM_SETCURFOCUS = (TCM_FIRST + 48); public const UInt32 TCM_SETMINTABWIDTH = (TCM_FIRST + 49); public const UInt32 TCM_DESELECTALL = (TCM_FIRST + 50); public const UInt32 TCM_HIGHLIGHTITEM = (TCM_FIRST + 51); public const UInt32 TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52); // optional wParam == mask public const UInt32 TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53); static void Main(string[] args) { IntPtr h = new IntPtr(句柄自己取); UInt32 count = SendMessage(h, TCM_GETITEMCOUNT, 0, 0); Console.WriteLine("共有 " + count + " 个分页"); UInt32 index = SendMessage(h, TCM_GETCURSEL, 0, 0); Console.WriteLine("当前选中第 " + (index + 1) + " 页"); if (index == 0) { index = count - 1; } else { index = 0; } SendMessage(h, TCM_SETCURSEL, index, 0); Console.WriteLine("已跳转到 " + (index + 1) + " 页"); Console.ReadKey(); } }}非常简单 继续请教,遇到问题了上面例子中的句柄是TabControl的句柄,我不知道, 我只知道每个TabPage的句柄 [DllImport("user32.dll", SetLastError = true)]static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32.dll", SetLastError = true)]static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);或者[DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]public static extern IntPtr GetParent(IntPtr hWnd);TabPage的句柄怎么取出来的?难道不用先取出TabControl句柄才能取TabPage句柄? 这些问题我已经解决了,已经实现了跨进程选择TabControl的当前页,不过发送了TCM_SETCURSEL消息后,Tabcontrol的标题确实有变化,不过TabPage的内容并没有变,我再用ShowWindow显示一下对应的Tabpage试试看 如何插入图片 C# 导出CSV文件 超过11位数自动识别为科学数字怎么解决? 如何让程序时间指定日期间隔触发某个事件? 运行时"未处理NullReferenceExption"错误 用多线程进行冒泡排序能提高排序的效率?为什么? 查询语句问题 谢谢大家 出来马上结贴 在线等 帮我看看...绑定问题?? 用C#调用C++写的DLL的问题 New关键字与virtual和override关键字的疑问。 怎么进行编译啊》急!!!!在线等~~ 我用格式“F4”,结果数据“12.5120”在DataGridView单元格中显示为“12.512”,最后一位0被省掉了,如何保留最后一位0 求助
不过前提都是要有窗体
不能使用鼠标消息,因为程序A点击TabPage的标题,会执行事件,我不希望事件被执行,只想切换页面。
这里有个帖子
然后你可以在需要切换tab页的界面调用切换页面事件模拟传入参数。定义一个变量或者判断sender参数是否为空 在事件里面判断然后判断是否执行该方法
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;namespace Text
{
public class Program
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern UInt32 SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam); public const UInt32 TCM_FIRST = 0x1300;
public const UInt32 TCM_GETIMAGELIST = (TCM_FIRST + 2);
public const UInt32 TCM_SETIMAGELIST = (TCM_FIRST + 3);
public const UInt32 TCM_GETITEMCOUNT = (TCM_FIRST + 4);
public const UInt32 TCM_GETITEMA = (TCM_FIRST + 5);
public const UInt32 TCM_GETITEMW = (TCM_FIRST + 60);
public const UInt32 TCM_SETITEMA = (TCM_FIRST + 6);
public const UInt32 TCM_SETITEMW = (TCM_FIRST + 61);
public const UInt32 TCM_INSERTITEMA = (TCM_FIRST + 7);
public const UInt32 TCM_INSERTITEMW = (TCM_FIRST + 62);
public const UInt32 TCM_DELETEITEM = (TCM_FIRST + 8);
public const UInt32 TCM_DELETEALLITEMS = (TCM_FIRST + 9);
public const UInt32 TCM_GETITEMRECT = (TCM_FIRST + 10);
public const UInt32 TCM_GETCURSEL = (TCM_FIRST + 11);
public const UInt32 TCM_SETCURSEL = (TCM_FIRST + 12);
public const UInt32 TCM_HITTEST = (TCM_FIRST + 13);
public const UInt32 TCM_SETITEMEXTRA = (TCM_FIRST + 14);
public const UInt32 TCM_ADJUSTRECT = (TCM_FIRST + 40);
public const UInt32 TCM_SETITEMSIZE = (TCM_FIRST + 41);
public const UInt32 TCM_REMOVEIMAGE = (TCM_FIRST + 42);
public const UInt32 TCM_SETPADDING = (TCM_FIRST + 43);
public const UInt32 TCM_GETROWCOUNT = (TCM_FIRST + 44);
public const UInt32 TCM_GETCURFOCUS = (TCM_FIRST + 47);
public const UInt32 TCM_SETCURFOCUS = (TCM_FIRST + 48);
public const UInt32 TCM_SETMINTABWIDTH = (TCM_FIRST + 49);
public const UInt32 TCM_DESELECTALL = (TCM_FIRST + 50);
public const UInt32 TCM_HIGHLIGHTITEM = (TCM_FIRST + 51);
public const UInt32 TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52); // optional wParam == mask
public const UInt32 TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53); static void Main(string[] args)
{
IntPtr h = new IntPtr(句柄自己取);
UInt32 count = SendMessage(h, TCM_GETITEMCOUNT, 0, 0);
Console.WriteLine("共有 " + count + " 个分页"); UInt32 index = SendMessage(h, TCM_GETCURSEL, 0, 0);
Console.WriteLine("当前选中第 " + (index + 1) + " 页"); if (index == 0)
{
index = count - 1;
}
else
{
index = 0;
} SendMessage(h, TCM_SETCURSEL, index, 0);
Console.WriteLine("已跳转到 " + (index + 1) + " 页"); Console.ReadKey();
}
}
}非常简单
上面例子中的句柄是TabControl的句柄,我不知道, 我只知道每个TabPage的句柄
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);或者[DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);TabPage的句柄怎么取出来的?难道不用先取出TabControl句柄才能取TabPage句柄?