一个老问题:如何获取其他窗体中的文本?望高手指点。(200分)

  • 主题发起人 主题发起人 slyr
  • 开始时间 开始时间
S

slyr

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:知道了控件的名称,是pbdw040,也得到了Handle,但是
这个控件好象不响应wm_gettext消息,使用sendmessage(h, wm_gettext, 200,integer(@str)取出的结果为空,但屏幕上确实是有文字的。

请各位大虾指点迷津,分不够可以再加。
 
看了以前的帖子,没有找到一个简单有效的方法,着急!
 
dfw里的高人怎么都休息了啊,自己顶
 
AddLen := SendMessage(Hwnd, WM_GETTEXTLENGTH, 0, 0);
SendMessage(Hwnd, WM_GETTEXT, AddLen+1, DWord(@addBuf));
 
如果控件采用了图片格式的,就得到不啦!
还有一种可能,这个控件下面还有子控件,如果你要得到的是子控件的TEXT,那需要更深入一层
 
to 我爱delphi: 这个方法我也用过的,结果一样,取出的还是空值。
to 江远:不是图片格式,好象是powerbuild里的一种数据控件,类似于
delphi下的DB类控件。

欢迎大家讨论此问题,分不够可以再加。
 
是不是有可能控件所在的程序对消息如:wm_gettext这些做过什么处理啊。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=6393
 
to: 大唐电信: 基本可以肯定没有对消息响应做特殊处理,最大可能
是类似于delphi的label,不对gettext消息响应。

to: Highpeak:谢谢提供信息,我立即调试这种方法,过一会儿公布
结果。
 
to: Highpeak:试过了,结果还是一样的,对编辑类控件都可以
取出,就是这个不行。

各位大虾:还有没有别的办法呢?是否可以拦截outtext或
drawtest函数?可是我这个窗口是显示后才去读取文本的,请
各位不吝赐教。
 
用钩子去拦截文字输出函数试试
 
to 网中戏: 谢谢你!
不过这个办法只是最后的办法了,我想应该有更简单的方法的,哎,这个
问题我搞了1天多,还是没有结果。苦恼

请大家积极参与。本问题讨论结束后,不论是我自己还是那位大虾解决的,
我都将公布最后的解决源码。请大家积极参与。
 
用spy++查看后发现,不是pbdw040控件,而是类似于Delphi下的label控件,得不到
handle的。请诸位大虾另给一种解决方案
 
得不到handle的话,估计没有什么好的办法。
除非搞个图像识别
^_^
 
还在进一步调试中,苦恼!
 
如果是delphi的程序但是用GetText消息得不到东西的话,应该是用的别的控件或者是屏蔽调了这个消息,具体的你调试看看吧
 
没有句柄,可能只能用类似屏幕取词之类的办法拉。
 
这个问题看来是没有解了
 
做一个循环,找到所有的控件,然后取所有控件的信息,应该可以得到!
我想你的问题应该还是在没有找对你所指的控件的句柄
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Grids, ComCtrls;

type
TCursorOper = class(TForm)
Timer1: TTimer;
Button2: TButton;
Panel1: TPanel;
ControlBar1: TControlBar;
Panel2: TPanel;
GroupBox2: TGroupBox;
GroupBox1: TGroupBox;
CursorStatus: TStatusBar;
Panel3: TPanel;
Label8: TLabel;
Button1: TButton;
Edit4: TEdit;
ANXinXiList: TListView;
Button4: TButton;
Panel4: TPanel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
label1: TLabel;
S: TLabel;
ShuBiao_X: TLabel;
ShuBiao_Y: TLabel;
JuBing: TEdit;
NeiRong: TEdit;
LeiMing: TEdit;
Panel5: TPanel;
Panel6: TPanel;
anEnabled: TCheckBox;
anShow: TCheckBox;
CheckBox1: TCheckBox;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ANXinXiListClick(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
CheckHand:Integer;
i:Integer;
procedure GetCurrsorStatus(var Msg: TMessage) ;message WM_LBUTTONDOWN;
procedure AddANXinXi(JuBing,NeiRong,LeiMing:String);
public
{ Public declarations }
end;

var
CursorOper: TCursorOper;

implementation

{$R *.dfm}
//------------------------------------------------------------------------------
function WindowEnabled(aHandle: HWND; aLparam: LPARAM): boolean; stdcall;
begin
if Not IsWindowEnabled(aHandle) then
begin
EnableWindow(aHandle,true);
end;
Result:=True;
end;

//------------------------------------------------------------------------------
function WindowDisEnabled(aHandle: HWND; aLparam: LPARAM): boolean; stdcall;
begin
if IsWindowEnabled(aHandle) then
begin
EnableWindow(aHandle,False);
end;
Result:=True;
end;

//------------------------------------------------------------------------------
function WindowShow(aHandle: HWND; aLparam: LPARAM): boolean; stdcall;
begin
ShowWindow(aHandle,SW_RESTORE);
Result:=True;
end;

function WindowHide(aHandle: HWND; aLparam: LPARAM): boolean; stdcall;
begin
ShowWindow(aHandle,SW_HIDE);
Result:=True;
end;

//------------------------------------------------------------------------------
function GetWindowInfo():Boolean;
begin
Result:=True;
end;

//------------------------------------------------------------------------------
procedure TCursorOper.AddANXinXi(JuBing, NeiRong, LeiMing: String);
var
InflList:TListItem;
JBCount:Integer;
begin
try
for JBCount:=0 to ANXinXiList.Items.Count-1 do
begin
if ANXinXiList.Items.Item[JBCount].Caption=JuBing then Exit;
end;
InflList:=ANXinXiList.Items.Add;
InflList.Caption:=JuBing;
InflList.SubItems.Add(NeiRong);
InflList.SubItems.Add(LeiMing);
except
end;
end;

procedure TCursorOper.Timer1Timer(Sender: TObject);
var
p:TPoint;
hand:hwnd;
str:Array[0..255] of char;
strclass:Array[0..255] of char;
begin
timer1.Enabled:=false;
GetCursorPos(p);
if (p.X>=CursorOper.Left) and (p.X<=CursorOper.Left+CursorOper.Width)
and (p.Y>=CursorOper.Top) and (p.Y<=CursorOper.Top+CursorOper.Height) then
begin
CursorStatus.Panels[0].Text:='在本窗体内';
end else
begin
CursorStatus.Panels[0].Text:='在本窗体外';
hand:=WindowFromPoint(p);

if anEnabled.Checked then EnumChildWindows(hand, @WindowEnabled, 0);
if Not anEnabled.Checked then EnumChildWindows(hand, @WindowDisEnabled, 0);
if anShow.Checked then EnumChildWindows(hand, @WindowShow, 0);
if Not anShow.Checked then EnumChildWindows(hand, @WindowHide, 0);

getwindowtext(hand,@str,length(str));
getclassname(hand,@strclass,length(str));
if CheckHand=hand then
begin
if i>=15 then
begin
AddANXinXi(inttostr(hand),str,strclass);
i:=0;
end else
begin
i:=i+1;
end;
end;
JuBing.Text:= inttostr(hand);
NeiRong.Text:=str;
LeiMing.Text:=strclass;
ShuBiao_X.Caption:=IntToStr(p.X);
ShuBiao_Y.Caption:=IntToStr(p.Y);
CheckHand:=hand;
end;
timer1.Enabled:=true;
end;

procedure TCursorOper.Button1Click(Sender: TObject);
begin
if edit4.Text<>'' then showwindow(strtoint(edit4.Text),sw_hide);
end;

procedure TCursorOper.GetCurrsorStatus(var Msg: Tmessage);
begin
//sendmessage(StrToInt(Edit1.Text),SW_RESTORE,0,0);
//if anHide.Checked then showwindow(strtoint(edit1.Text),sw_hide);
end;

procedure TCursorOper.ANXinXiListClick(Sender: TObject);
begin
if ANXinXiList.ItemIndex>=0 then
edit4.Text:=ANXinXiList.Items.Item[ANXinXiList.ItemIndex].Caption;
end;


procedure TCursorOper.Button4Click(Sender: TObject);
begin
if edit4.Text<>'' then
showwindow(strtoint(edit4.Text),SW_RESTORE);
end;

procedure TCursorOper.CheckBox1Click(Sender: TObject);
begin
setwindowlong(Handle,GWL_STYLE,sw_show);
end;

end.
 
后退
顶部