Delphi 如何获取具有相同类名的不同控件的句柄?

Delphi 如何获取具有相同类名的不同控件的句柄?,delphi,delphi-xe2,delphi-xe,Delphi,Delphi Xe2,Delphi Xe,我正在尝试使用delphi编程访问第三方应用程序的“文本框”,因此我需要使用FindWindowEx(…)函数查找每个“文本框”的句柄 问题是,由于所有文本框都有相同的类名和“无窗口名”,此函数只需给我第一个文本框句柄 如何在没有名称的情况下获取其余文本框句柄 提前感谢。您可以使用EnumChildWindows枚举第三方应用程序窗口的所有子窗口,并测试每个枚举窗口的类名,以查看它是否为“文本框”类。例如: function EnumChildren(hwnd: HWND; lParam: LP

我正在尝试使用delphi编程访问第三方应用程序的“文本框”,因此我需要使用FindWindowEx(…)函数查找每个“文本框”的句柄

问题是,由于所有文本框都有相同的类名和“无窗口名”,此函数只需给我第一个文本框句柄

如何在没有名称的情况下获取其余文本框句柄


提前感谢。

您可以使用
EnumChildWindows
枚举第三方应用程序窗口的所有子窗口,并测试每个枚举窗口的类名,以查看它是否为“文本框”类。例如:

function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  TextBoxClass = 'EDIT'; (?)
var
  ClassName: array[0..259] of Char;
begin
  Result := True;
  GetClassName(hwnd, ClassName, Length(ClassName));
  if ClassName = TextBoxClass then
    TStrings(lParam).Add(IntToHex(hwnd, 8));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  EnumChildWindows(OtherAppWnd, @EnumChildren, UINT_PTR(Memo1.Lines));
end;

为了有效地使用
FindWindowEx()
,您需要提前了解窗口UI的结构,例如通过Spy++、Winspector或其他类似工具。这样,您就可以知道有多少控件具有相同的类类型,它们之间的父/子关系是什么,等等,这样您就可以相应地编写
FindWindowEx()
。或者,如果目标UI使用对话框ID(VCL不使用,但Microsoft通常使用),那么您可以使用
GetDlgItem()
直接获取所需控件的句柄,而无需在代码中查找它们(同样,Spy++和类似工具可以向您显示这些ID是什么,以便您可以对它们进行编码).

我想您对FindWindowEx(父窗口把手,GW\U HwnNext,无,无)感兴趣,谢谢!但是“GW_HWNDNEXt”给出的下一个控制句柄可能不是下一个文本框。是的,但他需要构建一个递归函数来枚举所有子窗口,例如,两个文本框可能是父窗口的子窗口,而其他文本框是另一个窗口的子窗口,因此他需要使用find first进行“搜索”,找到下一个…非常感谢。只需对代码做一点修改,它就工作得很好。