// 爲指定的父窗口枚舉子窗口、按鈕
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;