请问如何取得已知进程下所有窗口的句柄? ( 积分: 200 )

W

wyqxp

Unregistered / Unconfirmed
GUEST, unregistred user!
比如,我的程序名字叫 aaa.exe 假设运行后的进程ID是1800,在我的aaa.exe 里打开的所有窗口的进程ID都是1800 我想知道他们的窗口句柄,和窗口大小,位置.
希望大家给个帮助,给分啊
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
非常简单,等一下我,忙完了就给答复。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
特意为你写了以下函数,重要的是明白函数想要达到的目的。这样,你如果觉得这些函数还不够用,就可以丢掉这些函数,写出自己的函数了。(注意,这些函数本身我就没有验证,只是写出一个大概的解题思路,仅供参考,跑得起来,那就是我写的,跑不起来,肯定不是我写的,并且我也不知道是谁写的):
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;
 
W

wyqxp

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥
我想知道相同进程ID的 是控件的窗口句柄,窗口大小,位置 谢谢
 
W

wyqxp

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥 可以留下QQ吗,或加我648194937
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
看仔细。子窗口枚举和顶层窗口枚举用到的枚举函数是不一样的。但无论如何,要得到子窗口,必先要得到顶层窗口。如果你已经不仅知道进程ID,而且也知道了顶层窗口句柄,那么,根据上面函数,已经写得明明白白了 ----- 直接使用子窗口枚举不就行了?
还是那句话,重要的是看明白我这些函数,以及每个函数想要达到的目的。
 
W

wyqxp

Unregistered / Unconfirmed
GUEST, unregistred user!
虽然没明白也给分
 
W

wyqxp

Unregistered / Unconfirmed
GUEST, unregistred user!
虽然没明白也给分
 

Similar threads

S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部