怎么切换TabCtrol的当前页(有点挑战,希望会的朋友不吝赐教)!

llsus 2012-08-13 04:27:40
有个程序A使用TabCtrol,有多个TabPage,我希望写另外一个程序B,在程序B中改变程序A中的当前TabPage,怎么实现?我已经知道程序A的每个TabPage的窗口句柄。有没有相关的方法或相关的API?
...全文
245 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
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();
}
}
}


非常简单



fsy123456accp 2012-08-14
  • 打赏
  • 举报
回复
好难啊 真的不知道 望赐教!
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
Tab控件有标准的Windows消息可以操作


失落的神庙 2012-08-14
  • 打赏
  • 举报
回复
http://www.cnblogs.com/kevinGao/archive/2011/10/30/2231524.html
这里有个帖子
然后你可以在需要切换tab页的界面调用切换页面事件模拟传入参数。定义一个变量或者判断sender参数是否为空 在事件里面判断然后判断是否执行该方法
llsus 2012-08-14
  • 打赏
  • 举报
回复
确实可行啊,谢谢楼上朋友。
llsus 2012-08-14
  • 打赏
  • 举报
回复
这些问题我已经解决了,已经实现了跨进程选择TabControl的当前页,不过发送了TCM_SETCURSEL消息后,Tabcontrol的标题确实有变化,不过TabPage的内容并没有变,我再用ShowWindow显示一下对应的Tabpage试试看
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
[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句柄?



llsus 2012-08-14
  • 打赏
  • 举报
回复
继续请教,遇到问题了


上面例子中的句柄是TabControl的句柄,我不知道, 我只知道每个TabPage的句柄
llsus 2012-08-14
  • 打赏
  • 举报
回复
谢谢楼上朋友,我试试你的代码,然后在来交流
jimh 2012-08-13
  • 打赏
  • 举报
回复
可以使用custom message, 自己定义事件,自己处理,这个事件id要定义大一点,不能跟系统事件重复。
llsus 2012-08-13
  • 打赏
  • 举报
回复
SendMessage 怎么实现?我WM_SETFOCUS 试过,失败了,可能用错了方法。应该用哪个消息?
不能使用鼠标消息,因为程序A点击TabPage的标题,会执行事件,我不希望事件被执行,只想切换页面。
寂小魔 2012-08-13
  • 打赏
  • 举报
回复
多多 观照。。。。。
关照
失落的神庙 2012-08-13
  • 打赏
  • 举报
回复
SendMessage 这个可以实现 系统API
不过前提都是要有窗体
llsus 2012-08-13
  • 打赏
  • 举报
回复
怎么这么快就沉了,不知道的朋友也帮我顶啊

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧