2015-06-12 1 views
0

Можно ли получить все окна hwnd из окна alt + tab - исключая Metro? Может быть, есть какая-то альтернатива для Windows 8?Получить все окна с alt + tab, исключая окна метро - Windows 8/8.1

Я пытался получить все окна с помощью функции EnumWindows и вставить hwnd's в функцию GetAltTabInfo, и он не работает для меня, я получаю сообщение об ошибке: «Invalid window handle» из GetLastError, потому что эта функция (GetAltTabInfo) больше не можно использовать, когда вы включили Aero, этот вывод отсюда: GetAltTabInfo usage?.

Нужна помощь.

ответ

1

Используя 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.
  • Не проверено широко