实际上,这个的核心是用于一个 GetWindowThreadProcess 的 API 函数,通过它可以确定指定的窗口所隶属的进程。然后,结合 EnumWindows 就可以完成这一操作了。假设我们将所有的窗口句柄到一个 TList 中,我们大概的代码逻辑如下:
function DoEnumProcessWnd(AWnd: HWND; AParam: LPARAM): Boolean; stdcall;
var
AId: Cardinal;
AList:TList;
begin
Result := true;
GetWindowThreadProcessId(AWnd, AId);
if AId = PCardinal(AParam)^ then
begin
AList:=PPointer(AParam+SizeOf(Pointer));
AList.Add(Pointer(AWnd);
end;
end;
function EnumProcessWindows(AProcessId:Cardinal;AList:TList):Integer;
var
AParam: array [0 .. 1] of Pointer;
begin
AParam[0] := Pointer(AProcessId);
AParam[1] := AList;
EnumWindows(@DoEnumProcessWnd, LPARAM(@AParam[0]));
Result := AList.Count;
end;注意一点,上面的代码未经测试,只是描述一个大概的逻辑,有问题请自行调试,思路就是这样子,具体的代码仅供参考。
