FindWindow函数

    技术2025-12-19  10

    如果你知道该窗口的类名或标题,可以直接将类名或标题代入下面的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;  

     

     

    最新回复(0)