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

时间:2012-05-18 15:07:59

标签: delphi delphi-xe2 delphi-xe

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

问题是,因为所有文本框都有相同的类名,“NO window name”,这个函数只能给我第一个TextBOx句柄!

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

提前致谢。

2 个答案:

答案 0 :(得分:9)

您可以使用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;

答案 1 :(得分:1)

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