// 为指定的父窗口枚举子窗口、按钮
function EnumChildWndProc(AhWnd: LongInt; AlParam: lParam): boolean; stdcall;
var
WndClassName: array [0 .. 254] of Char;
WndCaption: array [0 .. 254] of Char;
begin
GetClassName(AhWnd, WndClassName, 254);
GetWindowText(AhWnd, WndCaption, 254);
with Form1.Memo1 do
begin
lines.add('类名:' + string(WndClassName));
lines.add('标题:' + string(WndCaption));
lines.add('句柄:' + inttostr(AhWnd));
lines.add('-------');
end;
result := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hWnd: LongInt;
begin
Memo1.lines.Clear;
Memo1.lines.add(Edit1.Text + ' 有如下控件类名称');
hWnd := Strtoint(Edit1.Text);
// hWnd:=FindWindow(nil,pchar(Edit1.Text));
if hWnd <> 0 then
begin
EnumChildWindows(hWnd, @EnumChildWndProc, 0);
end
else
MessageBox(self.handle, '没找到该窗口句柄', '提示', 0);
end;
//根据句柄获取进程PID(需要引用PsAPI单元)
Function GetPidAndPath(Han: Hwnd): String;
Var
Pid: Cardinal;
PHandle: THandle;
Buf: Array [0 .. 254] Of Char;
Begin
GetWindowThreadProcessId(Han, @Pid); // 根据句柄获得进程PID
PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Pid); // 通过进程PID获取进程句柄
GetModuleFileNameEx(PHandle, 0, Buf, 255); // 通过进程句柄获取其模块路径
CloseHandle(PHandle);
if Buf <> '' then
Begin
Result := Buf; //返回程序路径
End;
End;
//枚举可视所有窗口句柄
procedure TForm1.Button1Click(Sender: TObject);
Var
A: Hwnd;
Sztext: Array [0 .. 254] Of Char;
begin
A := GetWindow(Handle, GW_HwndFirst);
while A <> 0 do
Begin
if (GetWindowText(A, Sztext, 254) > 0) And (IsWindowVisiBle(A)) then
Begin
Memo1.Lines.Add(Sztext);
End;
A := GetWindow(A, GW_HwndNext);
End;
end;
// 通过子窗口句柄获取最主窗口句柄
function ChildGetMainWindow(a: hWnd): Integer;
Var
Thw: hWnd;
TBl: Integer;
Begin
while a <> 0 do
Begin
if a <> 0 then
Result := a;
a := GetParent(a);
End;
End;