Показать список приложений, таких как 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;
}

0

Решение

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

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

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

3

Другие решения

Просто используйте 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;
}
0

По вопросам рекламы [email protected]