Alt + Tab菜单的HWND(按顺序)

时间:2014-09-29 15:21:49

标签: winapi

我有一个xy问题的情况,请原谅(Last activity time of HWND - get the last active hwnd)。本主题修复了这一点。

我需要按照alt +标签菜单的顺序获取一个HWND数组。

我正在考虑这样做:使用MSDN :: GetAltTabInfo,我认为我也提供了一个HWND,它会吐出来:

typedef struct tagALTTABINFO {
  DWORD cbSize;
  int   cItems;
  int   cColumns;
  int   cRows;
  int   iColFocus;
  int   iRowFocus;
  int   cxItem;
  int   cyItem;
  POINT ptStart;
} ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;

cxItem和cyItem在alt选项卡菜单中给出了HWND的位置?

这是怎么回事?这是我应该采取的方式吗?我必须首先知道一个HWND,然后在alt + tab菜单中用上面的函数测试它的位置?

或者有没有办法按照alt +标签菜单的顺序列出HWND?

2 个答案:

答案 0 :(得分:2)

您需要使用GetTopWindow / GetNextWindow按Z顺序通过桌面的子项进行枚举,然后测试样式以确定它是否有资格进入alt +标签列表。类似的东西:

HWND child = GetTopWindow(NULL);
LONG mask = WS_VISIBLE | WS_CAPTION;

while (child != NULL)
{
    LONG style = GetWindowLong(child, GWL_STYLE);

    if ((style & mask) == mask)
    {
        // do something with child.
    }

    child = GetNextWindow(child, GW_HWNDNEXT);
}

答案 1 :(得分:1)

这是对@CoryNelson的不同Windows版本代码的分析(非常感谢他的帮助)

通过物理测试进行的行为研究:

注意到,当最小化hwnd具有WS_ICONICWS_MINIMIZED标记时仍然具有WS_CAPTIONWS_VISIBLE标记 < / p>

win81:

  • 按预期工作,它关注最近使用的窗口EVEN IF minmized

win7和winxp:

  • 专注于浏览器,最小化,所以最后的重点是浏览器。划痕目前尚未最小化。测试结果::点击焦点大多数rec win profilist:它集中了临时,浏览器的hwnd没有出现在临时的hwnd之前(我希望它会在临时之前发生但是会有WS_MINIMIZED-or-something而只是缺少WS_VISIBLE什么的)

    //hwnds
    0x240de4 //scratch
    0x110e30 //browser
    
    • FIX:我不知道如何解决这个问题,任何人除了挂钩之外还有什么想法?我一直在思考,主要是为自己发布这个,但如果有人想更多地应用想法,那就欢迎!!
  • 如果所有窗口都被最小化:它会聚焦最小化的窗口
    • FIX:我可以通过查看WS_VISIBLE和WS_CAPTION找到的第一个hwnd是否已经最小化标志来修复,如果它确实继续运行直到找到最后一个WS_VISIBLE和WS_CAPTION(我很确定所有的那些)在它将具有最小化的标志之后,非常确定,因为它看起来像最小化它被抛出结束[在alt + tab菜单中]的数组(与焦点非最小化时不同,它被移动到数组的顶部[left in alt标签))

GUESSES因为我无法对这些

进行物理测试

win8的

  • 我猜win8的表现为win81

winvista

  • 我猜测winVist表现为winxp,win7表现为
  • 之间