特意为你写了以下函数,重要的是明白函数想要达到的目的。这样,你如果觉得这些函数还不够用,就可以丢掉这些函数,写出自己的函数了。(注意,这些函数本身我就没有验证,只是写出一个大概的解题思路,仅供参考,跑得起来,那就是我写的,跑不起来,肯定不是我写的,并且我也不知道是谁写的):
uses
Windows;
type
TEnumUserCallBack = function (WND:THandle;TopWindow:Boolean):Boolean;
// 用户回调
TShowUserEnumCallBack = function (WND:THandle;ARect:TRect;TopWindow:Boolean):Boolean;
// 显示回调
var
YouProcessId :longword = 0;
SUECB: TShowUserEnumCallBack = nil;
//==============================================================================
// 用户回调
//==============================================================================
function EnumUserCallBack(WND:THandle;TopWindow:Boolean):Boolean;
var
ARect: TRect;
W, H: integer;
APoint:TPoint;
begin
if GetWindowRect(WND, ARect) then
begin
if TopWindow then
begin
if Assigned(SUECB) then
SUECB(WND,ARect,TopWindow);
end
else
begin
W := ARect.Right - ARect.Left;
H := ARect.Bottom - ARect.Top;
APoint.X:= ARect.Left;APoint.Y := ARect.Top;
Windows.ScreenToClient(Wnd, APoint);
SetRect(ARect,APoint.x, APoint.x + W,APoint.y,APoint.y + H);
if Assigned(SUECB) then
SUECB(WND,ARect,TopWindow);
end;
end;
end;
//==============================================================================
// 子窗口枚举
//==============================================================================
function EnumChildProc(h_Wnd: HWND;
l_Param: LPARAM): Bool;
stdcall;
var
ARect: TRect;
APoint: TPoint;
begin
if IsWindowVisible(h_Wnd) then
begin
TEnumUserCallBack(l_Param)(h_Wnd,False);
end;
Result := True;
end;
//==============================================================================
// 顶级窗口枚举
//==============================================================================
function EnumWindowsProc(h_Wnd: HWND;
l_Param: LPARAM): Bool;
stdcall;
var
ProcessId:longword;
begin
GetWindowThreadProcessId(h_Wnd, @ProcessId);
if ProcessId = YouProcessId then
begin
if IsWindowVisible(h_Wnd) then
begin
TEnumUserCallBack(l_Param)(h_Wnd,True);
EnumChildWindows(h_Wnd, @EnumChildProc, l_Param);
end;
end;
Result := True;
end;
//==============================================================================
// 开始窗口枚举
//==============================================================================
function EnumWindowsProcFirst: Boolean;
begin
YouProcessId := 1800;
// 设置到你已经知道的进程 ID
Result := EnumWindows(@EnumWindowsProc, Longint(@EnumUserCallBack));
end;