如何得到运行期exe控件的属性并显示出来(200分)

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

sys6051

Unregistered / Unconfirmed
GUEST, unregistred user!
exe的控件是什么????[^]
 
应为在运行程序(exe)时得到form上控件的属性并显示出来
 
可以呀,枚举窗体,发现子窗体,判断类型。
 
实现IFormDesigner
 
应该可以,先列举出系统内所有的视窗,
然后判断视窗的类型,但是使用方面不能象DELPHI控件那样使用
比如,你得到一个EDIT或BUTTON视窗,得到它的HANDLE,那么得使用API去使用它
比如,改变它的TEXT或caption,得用SetWindowText(handle, 'new text');这样使用。
 
各位本人真罗嗦还要问几句,我的目的就是在程序运行时当选中某对象将此对象属性列出,
同时修改属性值改变对象外观,与delphi开发环境提供功能类似
 
应该不可能~~~~
 
procedure ChildToTreeNode(Hd: hwnd; Tn: TTreenode; tV: TTreeview);
//Yanlei E_mail:Yanleigis@21cn.com
var
FirstChildWindowhd, SecondChildWindowHd, Fhd: hwnd;
node1: TTreenode;
begin
FirstChildWindowhd := getWindow(hd, GW_CHILD);
if FirstChildWindowhd <> 0 then
begin
node1 := tv.Items.AddChild(tn, Findcontrol(FirstChildWindowhd).Name);
Fhd := getWindow(FirstChildWindowHd, GW_CHILD);
if Fhd <> 0 then
begin
ChildToTreeNode(FirstChildWindowHd, Node1, tv);
end;
SecondChildWindowhd := getwindow(FirstChildWindowhd, GW_HWNDNEXT);
while SecondChildWindowhd <> 0 do
begin
node1 := tv.Items.AddChild(tn, Findcontrol(SecondChildWindowhd).Name);
Fhd := getWindow(SecondChildWindowhd, GW_CHILD);
if Fhd <> 0 then
begin
ChildToTreeNode(SecondChildWindowhd, Node1, tv);
end;
SecondChildWindowhd := getwindow(SecondChildWindowhd, GW_HWNDNEXT);
end;

end;

end;

procedure objectToTreeview(Hd: hwnd; Tv: TTreeview);
var
FirstChildWindowhd, SecondChildWindowHd, Fhd: hwnd;
Node, node1: TTreenode;
begin
Tv.Items.Clear;
node := Tv.Items.Add(nil, Findcontrol(hd).Name);
FirstChildWindowhd := getWindow(hd, GW_CHILD);
if FirstChildWindowhd <> 0 then
begin
node1 := tv.Items.AddChild(node, Findcontrol(FirstChildWindowhd).Name);
Fhd := getWindow(FirstChildWindowHd, GW_CHILD);
if Fhd <> 0 then
begin
ChildToTreeNode(FirstChildWindowhd, Node1, tv);
end;
SecondChildWindowhd := getwindow(FirstChildWindowhd, GW_HWNDNEXT);
while SecondChildWindowhd <> 0 do
begin
node1 := tv.Items.AddChild(node, Findcontrol(SecondChildWindowhd).Name);
Fhd := getWindow(SecondChildWindowhd, GW_CHILD);
if Fhd <> 0 then
begin
ChildToTreeNode(SecondChildWindowhd, Node1, tv);
end;
SecondChildWindowhd := getwindow(SecondChildWindowhd, GW_HWNDNEXT);
end;

end;
end;
调用:
objectToTreeview(self.Handle, treeview1);
 
“我的目的就是在程序运行时当选中某对象将此对象属性列出,
同时修改属性值改变对象外观,与delphi开发环境提供功能类似”
是不能做到的,
取一个控件的属性比如EDIT,只能用API去做,
不能象在DELPHI程序里面用TEdit(otheredit).text := 'adfasdf';
只能setwindowtext(otheredithandle, 'new caption');
取它的TEXT也只能用getwindowtext(otheredithandle,@a);
 
可能是可以的,Delphi提供了一系列函数访问运行时类型信息(RTTI),
需要用到指针、内存访问等方法,你参数这方面的Delphi帮助文档,
仔细研究一下TObject类。
 
timer事件
var
Pos: TPoint;
Handle: HWND;
Buf: array[0..1024] of Char;
begin
GetCursorPos(Pos);
Handle := WindowFromPoint(Pos);
HandleEdit.Text := IntToStr(Handle);
GetClassName(Handle, Buf, 1024);
ClassEdit.Text := Buf;
SendMessage(Handle, WM_GETTEXT, 1024, Integer(@Buf));
TextEdit.Text := Buf;
end;
可以得到你鼠标指的地方的控件的类,句柄,text.
啊?又仔细看了一下,还是不知道你到底要做什么.
要反编译别人的exe控件属性么?
 
可以的,只是你要寫程式去處理你的控件的外觀,利用Form中相應事件的
Sender你可以少寫很多的代碼
 
试试下面的吧。[:D]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
TLHelp32,Controls, Forms, Dialogs, StdCtrls;

type
TProcessInfo = Record
ExeFile : String;
ProcessID : DWORD;
end;
pProcessInfo = ^TProcessInfo;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var p : pProcessInfo;
ContinueLoop:BOOL;
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
Memo1.lines.Add(Format('进程ID号:%d 文件名:%s',[p.ProcessID,p.ExeFile]) );
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

end.
 
to bubble
你的例子试过了,是那个意思,能否进一步赐教当找到控件handle如何将控件属性列出
,本人做工控软件用户需要定指自己显示界面,如往界面添加timage控件,然后找到timage.picture
属性赋图片
 
是不是这个意思?你是不是把问题说副杂了?
是不是这个意思?
是不是这个意思?
unit Unit1;

interface

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

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dx,dy:integer;

implementation

{$R *.DFM}

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Img:TImage;
begin
if (shift=[ssCtrl]) and (button=mbLeft) then //按住Ctrl点鼠标添加Image
begin
Img:=TImage.Create(self);
Img.Parent:=self;
Img.Left:=dx;
Img.Top:=dy;
Img.Width:=x-dx;
Img.Height:=y-dy;
if OpenDialog1.Execute then
Img.Picture.LoadFromFile(OpenDialog1.filename);
end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
dx:=x;
dy:=y;
end;

end.
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=849985
 
后退
顶部