[教程]枚举指定进程的所有窗口

实际上,这个的核心是用于一个 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;

注意一点,上面的代码未经测试,只是描述一个大概的逻辑,有问题请自行调试,思路就是这样子,具体的代码仅供参考。

分享到: