- 使用 FindWindow 或 EnumWindows 查找目标应用程序的顶级窗口。
- 调用 EnumChildWindows 枚举顶级窗口的所有子级。
- 在枚举回调中,使用 GetClassName 检查所需的窗口类。例如,对于原始 Win32 编辑窗口,它将是 EDIT。
使用 Spy++ 之类的工具来了解目标应用程序的结构,并找出它使用的精确窗口类名称。
你在评论中关于如何打电话的问题GetClassName
让我思考。如果您使用的是 XE3,您可以编写一个简单的类型记录帮助器,HWND
以便在语法上更清晰地获取类名:
type
THWNDHelper = record helper for HWND
private
function GetClassName: string;
public
property ClassName: string read GetClassName;
end;
function THWNDHelper.GetClassName: string;
var
Buffer: array [0..255] of Char;
begin
if Winapi.Windows.GetClassName(Self, @Buffer, Length(Buffer))=0 then
RaiseLastOSError;
Result := Buffer;
end;
然后你可以写hwnd.ClassName
来获取窗口类名。当然,如果你不使用 XE3,你可以这样做:
function GetWindowClassName(hwnd: HWND): string;
var
Buffer: array [0..255] of Char;
begin
if GetClassName(hwnd, @Buffer, Length(Buffer))=0 then
RaiseLastOSError;
Result := Buffer;
end;
请注意,我使用的缓冲区长度为 256,因为窗口类名称长度被限制为不超过该长度。
关于更新中的代码,您不能使用实例方法进行回调。回调必须像这样声明:
function EnumChildWindowsCallback(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
OutputDebugString(PChar(GetWindowClassName(hwnd)));
Result := True;
end;
这在文档中有明确说明。不幸的是EnumChildWindows
in的声明Windows.pas
完全放弃了回调函数的类型安全。所以你必须在没有编译器帮助的情况下把它做好。
还要注意HWND
和THandle
不是一回事。不要把它们混在一起。