获取目标界面数据??

Randyqiu 2009-03-18 04:19:55
http://zhidao.baidu.com/question/90115604.html
以上是我软件界面的图片地址(CSDN不让我贴图)
图片左方是我在一个实验软件运行的时候截取下来的,我的目的是截获该界面的数据用作分析。右方是用spy++看出来的,请注意有句柄的组件到tabsheet就截止了。
我想不明白的是,那些俄罗斯人在写这个实验软件的时候,是怎么实现这些数据的显示的?我估计了下,大概共有600多个变量,而且在实时更新,并且这个界面只是这个软件的一部分。如果用Label显示的话,那要消耗多少内存啊。。
你说的那个老妖前辈的软件我也试过了,貌似也看不出来什么,,
你说的递归遍历components,或者遍历controls,我不太明白你的意思,,那得先获取一个实例吧,可是我的那个界面上的组件是自定义的,从我截取的图上可以看到最顶层的叫做TfminfoPanels,那么Label的owner就不是TfminfoPanels了吧,否则的话,用你的方法去遍历也是可以得到的。


谢谢,问题解决的话,加200分!!
...全文
240 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Randyqiu 2009-03-20
  • 打赏
  • 举报
回复
回复mysterx:
但只要找到画出Label控件的组件,就可以枚举它的components,包括Label
  • 打赏
  • 举报
回复
哎呀,即便是TLabel,那也是弱控件,没有句柄,怎么能找到呢?它的功能就是个TEXTOUT。画上去的。
Randyqiu 2009-03-20
  • 打赏
  • 举报
回复
回复zsWang:
请问:
1.我对TLabel(AComponent).Caption)这句话不是很了解,可以告诉我这句代码获取的caption值是AComponent的什么值?当然从你的代码看对于TEdit和Memo来说是它们的text值。
2.那么这句代码可以获取自定义组件类似的相关值吗?
3.如果可以的话,我用你的方法,没有区分TLabel、TEdit等控件去获取所有的AComponent,但还是没有得到那些值。按理说即使是自定义控件,那最后在程序设计的时候,它应该还是作为和其它标准组件一样拖放到父窗体上去作为某个Component[i],那遍历所有的组件的时候也是会得到它的,老大你能替我分析下会是哪些原因导致这种状况吗?有可能是在程序运行的时候动态创建该自定义控件吗?可是它有几百个变量啊,,
谢谢!!!!!!!!!!!!!!
Randyqiu 2009-03-19
  • 打赏
  • 举报
回复
TO: Allan_xd
如果是个网页的话,那么它有句柄吗?用spy++能否看得出来呢?小弟从来没有接触过网页这部分内容,一窍不通,谢谢指点!!
Randyqiu 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Allan_xd 的回复:]
你是否把我的话理解错了?我是说你那个软件中的那个标签中显示的整个内容是一个网页的内容。你怎么证明了它就不是呢?
有些东西不是光看界面是不能做出正确判断的。
[/Quote]
呵呵,是我的不是,,
那请问,如果是一个网页的内容,那处理起来会有什么捷径吗?你有好的方法或者建议?谢谢指教。。
Randyqiu 2009-03-19
  • 打赏
  • 举报
回复
回复:zsWang
老大,貌似还是不行,,我知道你枚举了子组件和孙组件及其所属的所有组件,但是他数据的显示依然不是由这些组件的Label来体现的,请问这些数据的显示还有其它办法吗?谢谢!!!!!!
Randyqiu 2009-03-19
  • 打赏
  • 举报
回复
回复zsWang:
Spy4Win分析的结果是:1.提示含有组件包
2.这些窗体(包括我需要获取数据的界面窗体TfmInfoPanels)都是基于TForm的,
那如果它自定义的控件被封装在bpl里面了,我还能有啥办法去获取没?
我到那个软件安装目录下找到了几个bpl文件,但是bpl打不开,没有dpk源文件
Randyqiu 2009-03-19
  • 打赏
  • 举报
回复
回复zsWang:
谢谢老大!!
我昨天没搞明白Spy4Win可以分析代码,以为就识别控件的功能,,是我的失误,
按照你递归遍历的结果看,自定义控件的可能性很大,
王集鹄 2009-03-19
  • 打赏
  • 举报
回复
你怎么确认那些文字就是TLabel显示的?在我看来很可能是自定义控件。

上次我告诉你Spy4Win可以分析窗体代码(dfm),也许能分析出是什么控件。
进程 -> 该可执行文件中可能存在的DFM格式窗体
Allan_xd 2009-03-18
  • 打赏
  • 举报
回复
你是否把我的话理解错了?我是说你那个软件中的那个标签中显示的整个内容是一个网页的内容。你怎么证明了它就不是呢?
有些东西不是光看界面是不能做出正确判断的。
Randyqiu 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Allan_xd 的回复:]
标签中是否显示的是一个网页呀
[/Quote]
不是,界面我在帖子中的给出的网址中能够看到http://zhidao.baidu.com/question/90115604.html
genispan 2009-03-18
  • 打赏
  • 举报
回复
MARK
Allan_xd 2009-03-18
  • 打赏
  • 举报
回复
标签中是否显示的是一个网页呀
王集鹄 2009-03-18
  • 打赏
  • 举报
回复
试试这样:
unit Sniffer;

interface

uses Windows;

function ExeSniffer( // 执行嗅探
AHandle: THandle; // 窗体句柄
AParam: Integer // 附加参数
): BOOL; stdcall;

implementation

uses SysUtils, Classes, Controls, StdCtrls, Messages;

var
WM_SNIFFWINDOW: Longword;

type
TSnifferInfo = packed record
rHOOK: HHOOK;
rHandle: HWND;
rParam: Integer;
end;
PSnifferInfo = ^TSnifferInfo;

var
vMapFile: THandle;
vSnifferInfo: PSnifferInfo;

var
ControlAtom: TAtom;
ControlAtomString: string = '';
RM_GetObjectInstance: DWORD; // registered window message

function FindControl(Handle: HWnd): TWinControl;
var
OwningProcess: DWORD;
begin
Result := nil;
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
begin
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0));
end;
end; { FindControl }

procedure ScanComponent(AComponent: TComponent);
var
I: Integer;
S: string;
vCopyDataStruct: TCopyDataStruct;
begin
if not Assigned(AComponent) then Exit;
S := '';
if SameText(AComponent.ClassName, 'TLabel') then
begin
S := Format('%s: %s', [AComponent.Name,
QuotedStr(TLabel(AComponent).Caption)]);
end else if SameText(AComponent.ClassName, 'TMemo')
or SameText(AComponent.ClassName, 'TEdit') then
begin
S := Format('%s: %s', [AComponent.Name,
QuotedStr(TLabel(AComponent).Caption)]);
end;
vCopyDataStruct.cbData := Length(S);
vCopyDataStruct.dwData := 0;
vCopyDataStruct.lpData := @S[1];
SendMessage(vSnifferInfo^.rParam, WM_COPYDATA,
vSnifferInfo^.rHandle, Integer(@vCopyDataStruct));
for I := 0 to AComponent.ComponentCount - 1 do
ScanComponent(AComponent.Components[I]);
end;

function SnifferProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
case code of
HC_ACTION:
begin
if PCWPStruct(lParam)^.message = WM_SNIFFWINDOW then
begin
if ControlAtomString = '' then
begin
ControlAtomString := Format('ControlOfs%.8X%.8X', [
GetWindowLong(vSnifferInfo^.rHandle, GWL_HINSTANCE),
GetWindowThreadProcessId(vSnifferInfo^.rHandle)]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));
end;
ScanComponent(FindControl(vSnifferInfo^.rHandle));
end;
end;
end;
Result := CallNextHookEx(vSnifferInfo^.rHOOK, code, wParam, lParam);
end;

function ExeSniffer( // 执行嗅探
AHandle: THandle; // 窗体句柄
AParam: Integer // 附加参数
): BOOL; stdcall;
begin
vSnifferInfo^.rHandle := AHandle;
vSnifferInfo^.rParam := AParam;
vSnifferInfo^.rHOOK := SetWindowsHookEx(
WH_CALLWNDPROC, SnifferProc, HInstance, GetWindowThreadProcessId(AHandle));
Result := SendMessageTimeout(AHandle, WM_SNIFFWINDOW, 0, 0,
SMTO_NORMAL, 3000, THandle(Result)) = 0;
UnhookWindowsHookEx(vSnifferInfo^.rHOOK);
end;

initialization
WM_SNIFFWINDOW := RegisterWindowMessage('SnifferLib.SniffWindow');
vMapFile := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, '~Sniffer');
if vMapFile = 0 then
vMapFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(TSnifferInfo), '~Sniffer');
vSnifferInfo := MapViewOfFile(vMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);

finalization
UnmapViewOfFile(vSnifferInfo);
CloseHandle(vMapFile);

end.
Randyqiu 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 willflyz 的回复:]
zswang大侠最近比较少出现.
[/Quote]
呵呵,那各位也可以发表下自己的意见哪
Randyqiu 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mysterx 的回复:]
Label没有句柄,你打算怎么处理~呵呵~做个MARK。
[/Quote]
这个貌似已经实现了见
http://topic.csdn.net/u/20090314/14/fe341a25-d1f5-40c0-b012-44f581df8395.html
willflyz 2009-03-18
  • 打赏
  • 举报
回复
zswang大侠最近比较少出现.
CaiBirdy 2009-03-18
  • 打赏
  • 举报
回复
也可能用TextOut,呵呵,不用保存变量,只要临时获取一下就好
  • 打赏
  • 举报
回复
Label没有句柄,你打算怎么处理~呵呵~做个MARK。

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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