如果你知道该窗口的类名或标题,可以直接将类名或标题代入下面的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或TComboBox2、如果是多个编缉框,可以修改一下上面的代码: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;
