EnumWindows枚举窗口时是按照什么顺序?

Ray 2009-06-02 12:22:14
描述:

在使用EnumWindows枚举窗口时,同一个进程Id会有多个窗口句柄。
问题是在xp系统和2003下我对一个进程ID的窗口句柄枚举顺序不一样。

例如:
通过spy++看到,进程有个主窗口句柄,还有个tooltips_class32窗口,当然还有一些其他的窗口句柄。

在xp系统下,通过使用EnumWindows来枚举,发现总是先枚举到程序的主窗口句柄。
在2003下, 却总是先枚举到tooltips_class32这个窗口句柄
如果在2003,先用鼠标点击一下程序的主窗口句柄,然后再去枚举,发现先枚举到主窗口,后枚举到tooltips_class32窗口。

问题:

1、EnumWindows的枚举窗口的顺序是?

2、如何设置主窗口的属性,使得枚举同一进程ID的窗口句柄时,先枚举到主窗口? (设置为Topmost可以,但是想问一下有没有其他的方法?)

谢谢
...全文
672 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayexing 2011-12-06
  • 打赏
  • 举报
回复
楼主能贴出你是怎么解决的吗。
oyljerry 2009-06-02
  • 打赏
  • 举报
回复
EnumWindows enumerates the windows in top-down Z-order, so the first one found must be the one that's active

The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.

http://msdn.microsoft.com/en-us/library/ms633497.aspx
skyxie 2009-06-02
  • 打赏
  • 举报
回复
为什么非要坚持先enum到主窗口呢?

反正不论是否是先枚举到主窗口,你的EnumWindowsProc都会被多次调用,
你在EnumWindowsProc中通过窗口的窗口标题或者类名来判断是否是主窗口,是主窗口你再进行处理
Ray 2009-06-02
  • 打赏
  • 举报
回复
问题解决,结贴! 呵呵
Ray 2009-06-02
  • 打赏
  • 举报
回复
不过也有个小缺陷。

因为其他的程序有隐藏功能,就是可以双击后隐藏到任务栏,这个时候就不是 WS_VISIBLE了,呵呵

不过找到了一个好的思路,可以看看是否加一些其他的判断,更加精准的找到这个主窗口
Ray 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 skyxie 的回复:]
google了一下,感觉这个应该是你想要的
Get the Main Window, Get EXE Name
http://msdn.microsoft.com/en-us/magazine/cc301495.aspx

连类都给你封装好了CMainWindowIterator
[/Quote]

要的就是这个判断条件 呵呵
if ((GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE))

向skyxie致敬,谢谢你啊!


skyxie 2009-06-02
  • 打赏
  • 举报
回复
google了一下,感觉这个应该是你想要的
Get the Main Window, Get EXE Name
http://msdn.microsoft.com/en-us/magazine/cc301495.aspx

连类都给你封装好了CMainWindowIterator
Ray 2009-06-02
  • 打赏
  • 举报
回复
SetWindowPos为HWND_TOPMOST会起作用

但是在2003下,其他程序启动时界面总是在管理程序界面的后面,但管理程序界面没有设置成 Topmost

有点奇怪。

大家有没有其他的办法?
Ray 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 skyxie 的回复:]
引用 3 楼 rain81 的回复:
to skyxie and oyljerry:

谢谢你们的回复。

应用场景是有很多个程序窗口,然后由一个管理程序去管理这些程序。
管理程序可以获得一个其他程序的进程ID,然后我把这个进程ID当做一个参数,传入EnumWindows,在枚举的时候去匹配
进程ID,找到对应的窗口句柄。

我也想过用窗口标题,一是窗口比较多,而且会有变化。二是也可以通过把程序的进程ID和应用名(应用名和窗…
[/Quote]

被管理程序的种类是可随时添加的,所以类名也会随时添加,但都基于同一个界面模板。
我想根据类名来判断,也不是最好的办法。
skyxie 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rain81 的回复:]
to skyxie and oyljerry:

谢谢你们的回复。

应用场景是有很多个程序窗口,然后由一个管理程序去管理这些程序。
管理程序可以获得一个其他程序的进程ID,然后我把这个进程ID当做一个参数,传入EnumWindows,在枚举的时候去匹配
进程ID,找到对应的窗口句柄。

我也想过用窗口标题,一是窗口比较多,而且会有变化。二是也可以通过把程序的进程ID和应用名(应用名和窗口标题有一定关系)传给Enum…
[/Quote]

被管理窗口名可能变化,但是它的类名是固定的

每个被管理程序的主窗口类名你应该都知道的吧~
vcTiro 2009-06-02
  • 打赏
  • 举报
回复
这个我想是系统内部维护有一个窗口HANDLE队列,遍历该队列即可。
Ray 2009-06-02
  • 打赏
  • 举报
回复
to skyxie and oyljerry:

谢谢你们的回复。

应用场景是有很多个程序窗口,然后由一个管理程序去管理这些程序。
管理程序可以获得一个其他程序的进程ID,然后我把这个进程ID当做一个参数,传入EnumWindows,在枚举的时候去匹配
进程ID,找到对应的窗口句柄。

我也想过用窗口标题,一是窗口比较多,而且会有变化。二是也可以通过把程序的进程ID和应用名(应用名和窗口标题有一定关系)传给EnumWindows去匹配窗口,但是有时应用程序名也会被改来改去的。所以最后考虑这种方法。

所以想看一下是否可以通过设置先枚举到主窗口, 在xp系统下可以,但都是同样的程序在2003下就有点问题。

我尝试过使用把主窗口设置为前景窗口、设置焦点,也用过SetWindowPos为在2003下好像也不起作用。

SetWindowPos为HWND_TOP和HWND_TOPMOST也没有起作用,不会是放的位置不对?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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