c++ - 从 Alt + Tab 获取所有窗口,不包括 Metro 窗口 - Windows 8/8.1

标签 c++ winapi windows-8 windows-8.1

是否可以从 Alt + Tab 窗口获取所有窗口 hwnd - 除了 Metro?或许 Windows 8 有一些替代方案?

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

最佳答案

使用 "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
  • 没有广泛测试

关于c++ - 从 Alt + Tab 获取所有窗口,不包括 Metro 窗口 - Windows 8/8.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806029/

相关文章:

c++ - 覆盖 new 但告诉 unordered_map 不要使用它

delphi - 为什么当 LineTo 成功时 FillRect 不绘制?

c++ - Internet Explorer 控件不会加载 CSS 和 JS

c - 信号量函数

data-binding - “UpdateSourceTrigger=PropertyChanged” 等效于 WinRT-XAML 中的文本框

c# - WINRT_NOT_PRESENT 的目的是什么?

c++ - C++ 中变量存储在内存中的什么位置?

c++ - 如何修复基类中的内存分配错误?

git - 如何从 Visual Studio 中删除/stash GitExtensions 工具栏?

c++ - Autocad 怎么能这么快的平移和缩放?