找到了一个窗口,怎么对窗口中的控件进行操作?

时间:2021-04-12 06:50:18
我用FIND WINDOW找到了一个窗口,现在我要对窗口中一些控件进行操作,比如修改EDIT的TEXT,MEMO的TEXT,我怎么找到这些控件并进行控制?

8 个解决方案

#1


你把程序想象成什么了,想怎么改就怎么改。

#2


我把PACAL的源码找出来了,应该跟这个有关系。

function TComponent.FindComponent(const AName: string): TComponent;
var
  I: Integer;
begin
  Result := nil;
  if (AName <> '') and (FComponents <> nil) then
  begin
    if FSortedComponents = nil then
    begin
      { Fill the sorted list (and sort it) }
      FSortedComponents := TList.Create;
      FSortedComponents.Count := FComponents.Count;
      for I := 0 to FComponents.Count - 1 do
        FSortedComponents[I] := FComponents[I];

      FSortedComponents.SortList(
        function(Item1, Item2: Pointer): Integer
        begin
          Result := CompareText(TComponent(Item1).Name, TComponent(Item2).Name);
        end);
    end;
    Result := FindSortedComponent(AName, I);
  end;
end;

function TComponent.FindSortedComponent(const AName: string; var Index: Integer): TComponent;
var
  L, H, I, C: Integer;
  LList: PPointerList;
begin
  L := 0;
  H := FSortedComponents.Count - 1;
  LList := FSortedComponents.List;
  while L <= H do
  begin
    I := (L + H) shr 1;
    Result := TComponent(LList^[I]);
    C := CompareText(Result.Name, AName);
    if C < 0 then
      L := I + 1
    else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Index := I;
        Exit;
      end;
    end;
  end;
  Index := L;
  Result := nil;
end;

#3


void __fastcall TForm1::Button3Click(TObject *Sender)
{
HWND Formh = FindWindow(NULL,"测试窗口");
 if(Formh)
 {

HWND Edith = FindWindowEx(Formh,NULL,"TEdit",NULL);
   if(Edith)
  {
  int length = SendMessage(Edith, WM_GETTEXTLENGTH, 0, 0);
  // ShowMessage(length);
  char *Temp = new char[length];
  //GetWindowText(Memoh,Temp,length);
  SendMessage(Edith, WM_GETTEXT, length,(long)Temp );
  Memo1->Lines->Add(String(Temp));
  delete Temp;
  char TT[] = "测试文字";
   SendMessage(Edith, WM_SETTEXT, strlen(TT),(long)TT );
  }

 }
}
没有给你翻译,给你个例子

#4


获取窗体句柄,控件句柄,发送消息

#5


关键是看自己的进程还是别的进程?如果是自己的进程,可以用FindComponent或FindControl找到该组件的名称,然后以对象->属性的方式访问。

#6


不是自己的进程,也不是用VCL开发的。窗口中有三个EDIT,EDIT的标题会变,ID也会变(用SPY++看的)。GetDlgItem似乎不行。
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str);  //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?

#7


如果只是Edit类的窗口,找到该窗口句柄以后,用API:SetWindowText或者发消息WM_SETTEXT就可以更改其窗口文本。

至于其他类型的窗口,就要考虑另外的方法了。

#8


3楼zzb的代码中有一处错误,可能导致内存泄露。

delete Temp;

应该改成:

delete []Temp;

#1


你把程序想象成什么了,想怎么改就怎么改。

#2


我把PACAL的源码找出来了,应该跟这个有关系。

function TComponent.FindComponent(const AName: string): TComponent;
var
  I: Integer;
begin
  Result := nil;
  if (AName <> '') and (FComponents <> nil) then
  begin
    if FSortedComponents = nil then
    begin
      { Fill the sorted list (and sort it) }
      FSortedComponents := TList.Create;
      FSortedComponents.Count := FComponents.Count;
      for I := 0 to FComponents.Count - 1 do
        FSortedComponents[I] := FComponents[I];

      FSortedComponents.SortList(
        function(Item1, Item2: Pointer): Integer
        begin
          Result := CompareText(TComponent(Item1).Name, TComponent(Item2).Name);
        end);
    end;
    Result := FindSortedComponent(AName, I);
  end;
end;

function TComponent.FindSortedComponent(const AName: string; var Index: Integer): TComponent;
var
  L, H, I, C: Integer;
  LList: PPointerList;
begin
  L := 0;
  H := FSortedComponents.Count - 1;
  LList := FSortedComponents.List;
  while L <= H do
  begin
    I := (L + H) shr 1;
    Result := TComponent(LList^[I]);
    C := CompareText(Result.Name, AName);
    if C < 0 then
      L := I + 1
    else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Index := I;
        Exit;
      end;
    end;
  end;
  Index := L;
  Result := nil;
end;

#3


void __fastcall TForm1::Button3Click(TObject *Sender)
{
HWND Formh = FindWindow(NULL,"测试窗口");
 if(Formh)
 {

HWND Edith = FindWindowEx(Formh,NULL,"TEdit",NULL);
   if(Edith)
  {
  int length = SendMessage(Edith, WM_GETTEXTLENGTH, 0, 0);
  // ShowMessage(length);
  char *Temp = new char[length];
  //GetWindowText(Memoh,Temp,length);
  SendMessage(Edith, WM_GETTEXT, length,(long)Temp );
  Memo1->Lines->Add(String(Temp));
  delete Temp;
  char TT[] = "测试文字";
   SendMessage(Edith, WM_SETTEXT, strlen(TT),(long)TT );
  }

 }
}
没有给你翻译,给你个例子

#4


获取窗体句柄,控件句柄,发送消息

#5


关键是看自己的进程还是别的进程?如果是自己的进程,可以用FindComponent或FindControl找到该组件的名称,然后以对象->属性的方式访问。

#6


不是自己的进程,也不是用VCL开发的。窗口中有三个EDIT,EDIT的标题会变,ID也会变(用SPY++看的)。GetDlgItem似乎不行。
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str);  //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?

#7


如果只是Edit类的窗口,找到该窗口句柄以后,用API:SetWindowText或者发消息WM_SETTEXT就可以更改其窗口文本。

至于其他类型的窗口,就要考虑另外的方法了。

#8


3楼zzb的代码中有一处错误,可能导致内存泄露。

delete Temp;

应该改成:

delete []Temp;