从alt + tab获取所有窗口,不包括Metro窗口-Windows 8 / 8.1

问题描述 投票:0回答:1

是否可以从alt + tab窗口获取所有窗口-不包括Metro?也许Windows 8还有其他选择?

我试图使用EnumWindows函数获取所有窗口并将hwnd粘贴到GetAltTabInfo函数,但它对我不起作用,我从GetLastError收到错误消息:“无效的窗口句柄”,因为当以下情况时该函数(GetAltTabInfo)不再可用您已启用Aero,此结论来自此处:GetAltTabInfo usage?

需要帮助。

c++ winapi windows-8 windows-8.1
1个回答
1
投票

使用"Which windows appear in the Alt+Tab list?" article by Raymond Chen,我已经能够再现窗口列表。

// See http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx
BOOL IsAltTabWindow(HWND hwnd)
{
    // Start at the root owner
    HWND hwndWalk = GetAncestor(hwnd, GA_ROOTOWNER);

    // See if we are the last active visible popup
    HWND hwndTry;
    while ((hwndTry = GetLastActivePopup(hwndWalk)) != hwndTry) {
        if (IsWindowVisible(hwndTry)) break;
        hwndWalk = hwndTry;
    }
    return hwndWalk == hwnd;
}

BOOL CALLBACK CbEnumAltTab(HWND hwnd, LPARAM lParam)
{
    // Do not show invisible windows
    if (!IsWindowVisible(hwnd))
        return TRUE;

    // Alt-tab test as described by Raymond Chen
    if (!IsAltTabWindow(hwnd))
        return TRUE;

    const size_t MAX_WINDOW_NAME = 256;
    TCHAR windowName[MAX_WINDOW_NAME];
    if (hwnd == GetShellWindow())
        _tcscpy_s(windowName, MAX_WINDOW_NAME, _T("Desktop"));  // Beware of localization
    else
        GetWindowText(hwnd, windowName, MAX_WINDOW_NAME);

    // Do not show windows that has no caption
    if (0 == windowName[0])
        return TRUE;

    // Print found window to debugger's output
    const size_t MAX_MESSAGE_NAME = 64 + MAX_WINDOW_NAME;
    TCHAR message[MAX_MESSAGE_NAME];
    _stprintf_s(message, MAX_MESSAGE_NAME, _T("AltTab: %08X %s\n"), hwnd, windowName);
    OutputDebugString(message);

    return TRUE;
}

void ListAltTabWindows()
{
    EnumWindows(CbEnumAltTab, 0);
}

注意:

  • 似乎已经排除了地铁
  • 没有检查WS_EX_TOOLWINDOW
  • 未检查WS_EX_APPWINDOW
  • 未进行广泛测试
© www.soinside.com 2019 - 2024. All rights reserved.