Показать список приложений, таких как alt-tab в Win7

Я пытаюсь напечатать список запущенных приложений, которые мне может дать alt-tab. Вот что я сделал до сих пор:

1. Сначала я пробовал EnumWindows, но получил сотни записей.

2. Я нашел несколько похожих вопросов, и они привели меня в блог Рэймонда Чена. http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

Однако он по-прежнему показывает более 100 окон (window_num1 - 158, а window_num2 - 329), а alt-tab выдаст мне только 4. Что я сделал не так? Вот мой код:

#include <windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;

#pragma comment(lib, "user32.lib")

HWND windowHandle;
int window_num1=0;
int window_num2=0;

BOOL IsAltTabWindow(HWND hwnd)
{
    if (hwnd == GetShellWindow())   //Desktop
        return false;
    // 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 MyEnumProc(HWND hWnd, LPARAM lParam)
{
    TCHAR title[500];
    ZeroMemory(title, sizeof(title));

    //string strTitle;

    GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));

    if (IsAltTabWindow(hWnd))
    {
        _tprintf(_T("Value is %s\n"), title);
        window_num1++;
    }
    window_num2++;

    //strTitle += title; // Convert to std::string
    if(_tcsstr(title, _T("Excel")))
    {
        windowHandle = hWnd;
        return FALSE;
    }
    return TRUE;
}

void MyFunc(void) //(called by main)
{
    EnumWindows(MyEnumProc, 0);
}

int main() 
{
    MyFunc();
    cout<<endl<<window_num1<<endl<<window_num2;
    return 0;
}

2 ответа

Решение

Ваш провал в том, что вы должны ходить только видимые окна... читать блог снова.

Для каждого видимого окна поднимайтесь по его цепочке владельцев, пока не найдете корневого владельца. Затем спускайтесь вниз по видимой последней активной всплывающей цепочке, пока не найдете видимое окно. Если вы вернулись к тому, с чего начали, поместите окно в список Alt+↹Tab.

Ваш код проходит через все окна!

Просто используйте IsWindowVisible

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
    TCHAR title[256] = {0,};
    if (IsWindowVisible(hWnd) && GetWindowTextLength(hWnd) > 0)
    {
       window_num1++;
       GetWindowText(hWnd, title, _countof(title));
       _tprintf(_T("Value is %d, %s\n"), window_num1, title);
    }
    return TRUE;
 }
Другие вопросы по тегам