Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

ВОПРОС – ОТВЕТ 

Как получить список запущенных приложений?

Автор: Александр Федотов

Тестовое приложение Process Viewer – pview.zip (130 Kb)

Операционная система Windows знаменита своими окнами. Поэтому, когда заходит речь о приложениях, пользователи ассоциируют их с окнами, хотя с технической точки зрения правильнее было бы оперировать понятием процесса. В частности, под списком приложений пользователи часто подразумевают не список процессов, а список главных окон приложений, видимых на экране. В таком случае, задача перечисления приложений сводится к перечислению их главных окон.

Для перечисления всех окон верхнего уровня служит функция EnumWindows, однако, если мы просто вызовем эту функцию, то обнаружим, что она возвращает много больше окон, чем видно приложений на экране. Очевидно, мы должны игнорировать невидимые окна и окна, имеющие владельца (такие как диалоговые панели). Но даже и после этой фильтрации в списке будет несколько больше окон, чем отображает Task Manager.

Проведя несколько экспериментов с Windows NT Task Manager, удалось установить, что он игнорирует окна с пустым заголовком, и, как ни странно, окна с заголовком "Program Manager". Да-да, если вы создатите свое окно с таким заголовком, то оно не появится в списке приложений Task Manager. Обычно в системе есть только одно окно "Program Manager" – это то окно, на котором находится рабочий стол. Понятно, что пользователи не ассоциируют это окно с каким-либо приложением, для них оно является неотъемлемой частью компьютера, и поэтому Task Manager должен игнорировать это окно. Непонятно только, почему разработчики Task Manager решили определять это окно по его заголовку, а не по имени класса окна, которое есть "progman".

После того, как мы вставим все эти проверки, наш список уже ничем не будет отличаться от выводимого Task Manager. Ниже приведен код функцииEnumApplications, которая реализует перечисление приложений. Интерфейс функции построен в стиле функций-перечислителей в Win32 API: она принимает указатель на пользовательскую функцию, которую вызывает для каждого перечисляемого приложения.

typedef BOOL (CALLBACK * PFNENUMAPP)(

 IN HWND hWnd, // идентификатор главного окна приложения

 IN LPCTSTR pszName, // название приложения

 IN HICON hIcon, // иконка приложения

 IN LPARAM lParam // пользовательский параметр

);

typedef struct _ENUMAPPDATA {

 LPARAM lParam;

 PFNENUMAPP pfnEnumApp;

} ENUMAPPDATA, * PENUMAPPDATA;

static BOOL CALLBACK EnumWindowsCallback(IN HWND hWnd, IN LPARAM lParam) {

 PENUMAPPDATA pEnumData = (PENUMAPPDATA)lParam;

 _ASSERTE(_CrtIsValidPointer(pEnumData, sizeof(ENUMAPPDATA), 1));

 if (!IsWindowVisible(hWnd) || GetWindow(hWnd, GW_OWNER) != NULL) return TRUE;

 TCHAR szClassName[80];

 GetClassName(hWnd, szClassName, 80);

 if (lstrcmpi(szClassName, _T("Progman")) == 0) return TRUE;

 // получаем заголовок окна

 TCHAR szText[256];

 DWORD cchText = GetWindowText(hWnd, szText, 256);

 if (cchText == 0) return TRUE;

 HICON hIcon = NULL;

 // получаем иконку окна

 if (SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 0,

SMTO_ABORTIFHUNG|SMTO_BLOCK, 1000, (DWORD_PTR *)&hIcon)) {

if (hIcon == NULL) {

if (!SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0,

SMTO_ABORTIFHUNG|SMTO_BLOCK, 1000, (DWORD_PTR *)&hIcon)) hIcon = NULL;

}

 } else hIcon = NULL;

 if (hIcon == NULL) hIcon = (HICON)GetClassLong(hWnd, GCL_HICONSM);

 if (hIcon == NULL) hIcon = (HICON)GetClassLong(hWnd, GCL_HICON);

 if (hIcon == NULL) hIcon = LoadIcon(NULL, IDI_APPLICATION);

 // вызываем пользовательскую функцию

 return pEnumData->pfnEnumApp(hWnd, szText, hIcon, pEnumData->lParam);

}

BOOL EnumApplications(IN PFNENUMAPP pfnEnumApp, IN LPARAM lParam) {

 _ASSERTE(pfnEnumApp!= NULL);

 ENUMAPPDATA EnumData;

 EnumData.pfnEnumApp = pfnEnumApp;

 EnumData.lParam = lParam;

 return EnumWindows(EnumWindowsCallback, (LPARAM)&EnumData);

}

Как видно, функция EnumApplications чрезвычайно проста – она просто вызывает EnumWindows и вся основная работа по фильтрации ненужных окон ложится на вспомогательную функцию EnumWindowsCallback.

  • Читать дальше
  • 1
  • ...
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: