如果你知道该窗口的类名或标题,可以直接将类名或标题代入下面的FindWindow函数中,下面的代码首先查找目标窗口的句柄,再枚举该窗口的子窗口,判断子窗口的类名是否为"Edit"或"TEdit",若是,则认为已经找到编缉框。找到后,再发送WM_GETTEXTLENGTH和WM_GETTEXT消息来获取编缉框的文本长度及内容。
var
hwndEdit:THandle;
function EnumWindowProc(hwnd:THandle;lParam:LPARAM):BOOL;stdcall;
var
ClassName:array[0..255] of Char;
begin
Result:=True;
if GetClassName(hwnd,ClassName,256)>0 then
if SameText(ClassName,'TEdit') or SameText(ClassName,'Edit') then
begin
Result:=False;
hwndEdit:=hwnd;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hWin:THandle;
buf:string;
iLen:Integer;
begin
hwndEdit:=0;
hWin:=FindWindow('TRegFrm',nil);
if hWin<>0 then
begin
EnumChildWindows(hWin,@EnumWindowProc,0);
end;
if hwndEdit>0 then
begin
iLen:=SendMessage(hwndEdit,WM_GETTEXTLENGTH,0,0);
SetLength(buf,iLen+1);
GetWindowText(hwndEdit,PChar(@buf[1]),iLen+1);
ShowMessage(buf);
end;
end;
//附:如果你不知道目标窗口的类名,那么请在窗口上放一个TTimer,一个TEdit
在OnTimer事件中写如下代码,编译执行后将Mouse移到目标窗口上,目标窗口的类名则会显示在TEdit上。
procedure TForm1.Timer1Timer(Sender: TObject);
var
p:TPoint;
hwnd:THandle;
ClassName:array[0..255] of Char;
begin
GetCursorPos(p);
hwnd:=WindowFromPoint(p);
if hwnd<>0 then
begin
GetClassName(hwnd,ClassName,256);
Edit1.Text:=ClassName
end;
end;
1、如果是ComboBox,那么将
if SameText(ClassName,'TEdit') or SameText(ClassName,'Edit') then
改为
if SameText(ClassName,'TComboBox') or SameText(ClassName,'COMBOBOX') then
最好使用上面附带的方法查看一下它的类名。一般情况下为COMBOBOX或TComboBox
2、如果是多个编缉框,可以修改一下上面的代码:
function EnumWindowProc(hwnd:THandle;lParam:LPARAM):BOOL;stdcall;
var
ClassName:array[0..255] of Char;
buf:string;
iLen:Integer;
begin
Result:=True;
if GetClassName(hwnd,ClassName,256)>0 then
if SameText(ClassName,'TComboBox') or SameText(ClassName,'COMBOBOX') then
begin
iLen:=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
SetLength(buf,iLen+1);
GetWindowText(hwnd,PChar(@buf[1]),iLen+1);
ShowMessage(buf);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hWin:THandle;
begin
hwndEdit:=0;
hWin:=FindWindow('TRegFrm',nil);
if hWin<>0 then
EnumChildWindows(hWin,@EnumWindowProc,0);
end;
LISTBOX处理方法不一样,需要一条一条地读取。
var
iCount,iLen,I:Integer;
retStr:string;
buf:string;
begin
retStr:='';
iCount:=SendMessage(hwnd,LB_GETCOUNT,0,0);
for I:=0 to iCount-1 do
begin
iLen:=SendMessage(hwnd,LB_GETTEXTLEN,0,0);
SetLength(buf,iLen+1);
SendMessage(hwnd,LB_GETTEXT,I,Integer(@buf[1]));
retStr:=retStr+Trim(buf)+#13#10;
end;
ShowMessage(retStr);
end;