实际上,这个的核心是用于一个 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;
注意一点,上面的代码未经测试,只是描述一个大概的逻辑,有问题请自行调试,思路就是这样子,具体的代码仅供参考。