我正在尝试使用delphi编程访问第三方应用程序的“文本框”,因此我需要使用FindWindowEx(...)函数找到每个“文本框”的句柄。
问题是,因为所有文本框都有相同的类名,“NO window name”,这个函数只能给我第一个TextBOx句柄!
如何在没有名字的情况下获取其余的文本框句柄?
提前致谢。
答案 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是什么,因此您可以对它们进行编码)。