找到SysTabControl32的句柄 怎样取得的每个tab的标题?该怎么解决
找到SysTabControl32的句柄 怎样取得的每个tab的标题?
Hwnda := FindWindowEx(Hwnda,0,'SysTabControl32',nil);//找到句柄
SendMessage(Hwnda, TCM_GETITEMCOUNT, 0, 0);//可以找到tab总数
SendMessage(Hwnda, TCM_GETITEMW, 0, longint(@buf));//这个取不出标题
SendMessage(Hwnda, TCM_GETITEM, 0, longint(@item));//这个可以找到 item 但还是取不到标题
请问怎样才能取得的每个tab的标题?
------解决方案--------------------
使用TCM_GETITEM 这个消息取得Item,但是不一定会有标题,因为标题并不是必须的。
------解决方案--------------------
如果你是取得别人窗口中的该控件的句柄的话,那么你一定要在那个进程内部才能获得标题
具体代码,可以看看CnPack中的任务栏控件TCnTaskBar中的代码
------解决方案--------------------
参考
Hwnda := FindWindowEx(Hwnda,0,'SysTabControl32',nil);//找到句柄
SendMessage(Hwnda, TCM_GETITEMCOUNT, 0, 0);//可以找到tab总数
SendMessage(Hwnda, TCM_GETITEMW, 0, longint(@buf));//这个取不出标题
SendMessage(Hwnda, TCM_GETITEM, 0, longint(@item));//这个可以找到 item 但还是取不到标题
请问怎样才能取得的每个tab的标题?
------解决方案--------------------
使用TCM_GETITEM 这个消息取得Item,但是不一定会有标题,因为标题并不是必须的。
------解决方案--------------------
如果你是取得别人窗口中的该控件的句柄的话,那么你一定要在那个进程内部才能获得标题
具体代码,可以看看CnPack中的任务栏控件TCnTaskBar中的代码
------解决方案--------------------
参考
- Delphi(Pascal) code
function TTabStrings.Get(Index: Integer): string; const RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING); var TCItem: TTCItem; Buffer: array[0..4095] of Char; begin TCItem.mask := TCIF_TEXT or RTL[FTabControl.UseRightToLeftReading]; TCItem.pszText := Buffer; TCItem.cchTextMax := SizeOf(Buffer); if SendMessage(FTabControl.Handle, TCM_GETITEM, Index, Longint(@TCItem)) = 0 then TabControlError(Format(sTabFailRetrieve, [Index])); Result := Buffer; end;
------解决方案--------------------
关注。
------解决方案--------------------
闲下来了,研究了一下,下面的代码可以实现:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
TabSheet6: TTabSheet;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses CommCtrl;
function TabStringsGet(h:HWND;Index: Integer): string;
const
RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING);
var
TCItem: TTCItem;
Buffer: array[0..4095] of Char;
begin
TCItem.mask := TCIF_TEXT;
TCItem.pszText := Buffer;
TCItem.cchTextMax := SizeOf(Buffer);
SendMessage(h, TCM_GETITEM, Index,Longint(@TCItem));
Result := Buffer;
end ;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
h:hwnd;
begin
h:=FindWindow(0,'SysTabControl32的句柄,即TAB的父句柄');
if h=0 then exit;
for i:=0 to SendMessage(h, TCM_GETITEMCOUNT, 0, 0)-1 do
showmessage(TabStringsGet(h,i));
end;
end.
------解决方案--------------------
可以EnumWindowEx枚举所有的窗口和子窗口...然后发送消息TCM_GETITEM