诚心请大虾给个注释,在网上看到的部分程序,看不懂。
function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean;
var
buffer: array[0..255] of char;
begin
Result := True; //这行是什么意思?
GetClassName(hwnd,buffer,256);//根据句柄获取类名
if StrPas(Buffer)='Edit' then //如果类名是Edit
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam); //这行是什么意思?
Result:=False; //这行是什么意思?
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd<> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
Caption := StrPas(buffer);
end;
end;
function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean;
var
buffer: array[0..255] of char;
begin
Result := True; //这行是什么意思?
GetClassName(hwnd,buffer,256);//根据句柄获取类名
if StrPas(Buffer)='Edit' then //如果类名是Edit
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam); //这行是什么意思?
Result:=False; //这行是什么意思?
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd<> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
Caption := StrPas(buffer);
end;
end;
解决方案 »
- delphi+sql查询和写入问题
- 多线程调用动态链接库问题,在线等,高手进~~~
- Indy10 IdHTTP Get用法求助
- ◎◎◎◎出错了!求教了!帮忙了!给分了!(大概是关于数据库的问题)◎◎◎◎
- 王鹏同志逝世!!! 英雄!!! 默哀~~~~~~~
- 急救,急救。字符串处理中遇到的怪问题
- 双击ADOTABLE控件会弹出字段编辑器,选择全部字段后向窗体拉可以自动为字段产生相应的数据感知控件,怎样用语句实现以上过程?
- 让DBEdit如何和Listbox中相应的项联系
- 终于升级为星级会员,希望大家给我捧个人场,UP者皆有分,在此先谢过了。
- 如何把JPG图片存入数据库?
- 碰到一个无模式窗体的问题
- delphi文件读取与写入问题
var
buffer: array[0..255] of char;
begin
Result := True; //返回True的意思就是继续往下遍历
GetClassName(hwnd,buffer,256);//根据句柄获取类名
if StrPas(Buffer)='Edit' then //如果类名是Edit
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
Result:=False; //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd<> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
Caption := StrPas(buffer);
end;
end;
这句中,@EnumChildWindowsProc是什么意思?
SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
这部分,获取后,怎么才能把这部分的内容发送到memo中?
诚心请教。
函数原型:
BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
各个参数如下:
HWND hWndParent 父窗口句柄
WNDENUMPROC lpEnumFunc 回调函数的地址
LPARAM lParam 自定义的参数
注意:回调函数的返回值将会影响到这个API函数的行为。如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。EnumChildWindowsProc为回调函数,通过这个函数循环枚举HWND下的所有子窗口,当EnumChildWindowsProc返回为False的时候则停止枚举。
var
buffer: array[0..255] of char;
begin
Result := True; //返回True的意思就是继续往下遍历
GetClassName(hwnd,buffer,256);//根据句柄获取类名
if StrPas(Buffer)='Edit' then //如果类名是Edit
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
Result:=False; //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd<> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
//Caption := StrPas(buffer);
Memo1.Lines.Add(StrPas(buffer));//显示到Memo中
end;
end;
var
buffer: array[0..255] of char;
begin
Result := True; //返回True的意思就是继续往下遍历
GetClassName(hwnd,buffer,256);//根据句柄获取类名
if StrPas(Buffer)='Edit' then //如果类名是Edit
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
Result:=False; //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
Form1.Memo1.Lines.Add(StrPas(buffer));//显示到Form1的Memo中
如果你把Result:=False;这句Mark掉,则程式会将hwnd下所有的Edit的内容显示到Memo中,你可以试下
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd<> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
//Caption := StrPas(buffer);
end;
end;
begin
Result:=True;
GetClassName(AhWnd,wndClassName,254);
if StrPas(WndClassName)='Edit' then
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam);{编译中总是提示:1.[Error] Unit1.pas(40): '(' expected but ',' found,2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found} Form1.Memo1.Lines.Add(StrPas(GetClassName));
end;
end;
改为
Form1.Memo1.Lines.Add(PChar(lparam));
SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
编译中总是提示:
1.[Error] Unit1.pas(40): '(' expected but ',' found,
2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,buffer,256);
if StrPas(Buffer)='Edit' then
begin
SendMessage(hwnd,WM_GETTEXT,256,lparam);
Form1.Memo1.Lines.Add(PChar(lparam));
Result:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd <> 0 then
begin
EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
Caption := StrPas(buffer);
end;
end;end.
SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
编译中总是提示:
1.[Error] Unit1.pas(40): '(' expected but ',' found,
2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found
参考这一份,我测试了没问题。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function GetWndText(ThWnd: hWnd): string;
var
Ret:LongInt;
mText:PChar;
Buf:Integer;
begin
Ret := SendMessage(ThWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
GetMem(mText,Ret);
try
Buf := LongInt(mText);
SendMessage(ThWnd, WM_GETTEXT, Ret, Buf);
Result := StrPas(mText);
finally
FreeMem(mText,Ret);
end;
end;function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,@buffer,256);
if Buffer='Edit' then
begin
Form1.Memo1.Lines.Add(IntTOHex(hwnd, 8) +': '+ GetWndText(hwnd));
//SendMessage(hwnd,WM_GETTEXT,256,lparam);
Result:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd <> 0 then
begin
Form1.Memo1.Lines.Add('Handle: ' + IntTOHex(hwnd, 8));
EnumChildWindows(hwnd,@EnumChildWindowsProc,0);
//Caption := StrPas(buffer);
end;
end;end.
我没有说清楚,这个Edit是另外的程序中的,和Memo不在同一个程序中。
这个程序就是寻找到另外程序的句柄后,再遍历子窗口,如果是edit就把文本读出来。getwindowtext只能读取到其他的控件的,Edit读不出来。
SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
编译中总是提示:
1.[Error] Unit1.pas(40): '(' expected but ',' found,
2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found
参考这一份,我测试了没问题。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function GetWndText(ThWnd: hWnd): string;
var
Ret:LongInt;
mText:PChar;
Buf:Integer;
begin
Ret := SendMessage(ThWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
GetMem(mText,Ret);
try
Buf := LongInt(mText);
SendMessage(ThWnd, WM_GETTEXT, Ret, Buf);
Result := StrPas(mText);
finally
FreeMem(mText,Ret);
end;
end;function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,@buffer,256);
if Buffer='Edit' then
begin
Form1.Memo1.Lines.Add(IntTOHex(hwnd, 8) +': '+ GetWndText(hwnd));
//SendMessage(hwnd,WM_GETTEXT,256,lparam);
Result:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd: Integer;
buffer: array[0..255] of char;
Begin
hwnd := FindWindow('CabinetWClass',nil);
if hwnd <> 0 then
begin
Form1.Memo1.Lines.Add('Handle: ' + IntTOHex(hwnd, 8));
EnumChildWindows(hwnd,@EnumChildWindowsProc,0);
//Caption := StrPas(buffer);
end;
end;end.
感谢feiba7288的全方位的答复。辛苦你了。能否加我关注啊,这样我才能给你发私信。
我没有说清楚,这个Edit是另外的程序中的,和Memo不在同一个程序中。
这个程序就是寻找到另外程序的句柄后,再遍历子窗口,如果是edit就把文本读出来。getwindowtext只能读取到其他的控件的,Edit读不出来。
先结贴,辛苦大虾!!!