关于枚举所有顶级窗口的问题.

Y.A.K.E 2019-11-11 09:52:35


求各位老师来教育教育我.
让我实现: 枚举所有顶级句柄,但是一个进程(pid),只收集一个主窗口句柄的办法.

下面的问题都是围绕这个出发点提的.


Q1 : 已知一个句柄,获取它主窗口的顶级句柄到底是哪个方法?
网上找了好多
GetParent(hwd);
GetWindow(hwd,GW_OWNER);
GetWindow(hwd,GW_CHILD);
GetTopWindow(hwd);
GetWindowLong(hwd,GWL_HWNDPARENT);

最看不懂就是这个位运算了

GetWindowLong(hwd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW


我平时用的就是GetParent,但是,最近在学习枚举顶级窗口,获取顶级句柄的时候碰到一个问题.


Q2:


SPY++ 获取QQ句柄,对应的父窗口的句柄就是桌面(GetDesktopWindow)




但是我通过枚举获取,QQ这个句柄,为啥父句柄是非桌面句柄?




我的代码如下


//句柄和进程一一对应的结构体
type twindata=record
pid: DWORD;
hwd:hwnd;
end;

var
all_td:array of twindata;



function EnumWindowsProc(Wnd: HWND; var lp: integer): Bool; stdcall;
var
PID: DWORD;
begin


GetWindowThreadProcessID(Wnd, @PID);

setlength(all_td,length(all_td)+1);
all_td[length(all_td)-1].pid:=PID;
all_td[length(all_td)-1].hwd:=Wnd;

end;



Result := True;
end;

procedure get_all_window_list();
begin
EnumWindows(@EnumWindowsProc, 0);
//EnumDesktopWindows(0,@EnumWindowsProc, 0); //两个好像没区别
end;




procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
tmp_wintext:array[0..254] of wideChar;

begin
setlength(all_td,0);

get_all_window_list();

ListView1.Clear;

for I := Low(all_td) to High(all_td) do
begin
GetWindowTextW(all_td[i].hwd,@tmp_wintext,SizeOf(tmp_wintext));

with listview1.items.add do
begin
caption:= inttostr(all_td[i].pid); //pid

subitems.add(inttostr(all_td[i].hwd)); //hwd

subitems.add(tmp_wintext); //标题

subitems.Add(booltostr(IsWindowVisible(all_td[i].hwd),true)); //是否显示

subitems.Add(inttostr(GetParent(all_td[i].hwd))); //父句柄

subitems.Add(inttostr(GetWindow(all_td[i].hwd, GW_OWNER))); //状态1

subitems.Add(inttostr(GetWindow(all_td[i].hwd, GW_CHILD))); //状态2

subitems.Add(inttostr(GetTopWindow(all_td[i].hwd))); //状态3

subitems.Add(inttostr(GetWindowLong(all_td[i].hwd, GWL_HWNDPARENT))); //状态4

subitems.Add(inttostr((GetWindowLong(all_td[i].hwd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW))); //状态5

end;

end;


end;




...全文
200 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2019-12-17
  • 打赏
  • 举报
回复

你的范围是不是有点广泛了。。。。。。。。

何为“所有顶级窗口”??
桌面级的顶,局部应用的顶级??

这不未开始就让自己迷惑了?

一般来说,所谓的顶级就HWND为零的桌面顶级窗口

至于你说的Q2,觉得你也是自己给自己找不自在吧,很明显,那个QQ是隐藏的“显示——FALSE"
tzlaoliu 2019-11-14
  • 打赏
  • 举报
回复
不要上来就拿QQ练手
先拿记事本或者计算器来试验

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧