Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

После того, как мы вставим все эти проверки, наш список уже ничем не будет отличаться от выводимого 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.

В функции EnumWindowsCallback мы сначала отсеиваем невидимые окна, и окна, имеющие владельца. Затем мы проверяем, не является ли данное окно окном рабочего стола. Здесь мы не уподобляемся разработчикам Windows NT Task Manager и используем имя класса окна для проверки. Наконец, мы отбрасываем окна с пустым заголовком.

После того, как мы определи, что данное окно представляет некоторое приложение, мы собираем информацию об окне, чтобы передать ее пользовательской функции. Сначала мы получаем заголовок окна с помощью хорошо известной функцииGetWindowText. Затем мы пытаемся получить иконку окна. Обратите внимание, мы используем функцию SendMessageTimeout с флагом SMTO_ABORTIFHUNG для посылки сообщения WM_GETICON. Это гарантирует, что наше приложение не зависнет, даже если приложение, которому принадлежит окно, перестало обрабатывать сообщения.

Когда все параметры определены, мы вызываем пользовательскую функцию. Пользовательская функция, в свою очередь, может распоряжаться этими данными по своему усмотрению. Например, в тестовом приложении Process Viewer, которое сопровождает эту статью, она добавляет очередной элемент в список приложений.

Cсылки

1. Q175030 HOWTO: Enumerate Applications in Win32, Microsoft Knowledge Base.

ФОРУМ RSDN – ИЗБРАННОЕ

Тема: ООП и наследование

Вопрос: Есть базовый класс, из ЕГО конструктора вызывается метод ЭТОГО же (базового) класса.

Cbase::Cbase {

 someFunction;

}

void Cbase::someFunction {

 <SOME ACTION>

}

Так вот. Этот класс наследуют другие классы. НО! В их конструкторах нет вызова someFunction, – КОТОРАЯ ВИРТУАЛЬНАЯ, и по логике должна переназначаться классами, которые наследуют Cbase

Но при объявлении Csomefrombase : public Cbase, при объявлении объекта вызывается someFunction класса Cbase! Но нужно, чтобы вызывалась ТОЛЬКО Csomefrombase::someFunction!

Кто-нибудь подскажет, как решить данную проблему?

Utandr 

Предположим, всё работает по твоей логике. Угадай, что произойдёт вот в таком случае? 

class A {

public:

 A { f; }

 virtual void f {}

};

class B: public A {

public:

 int *n;

 B {

n = new int[10];

 }

};

class C: public B {

public:

 virtual void f {

for (int i=0; i<10; i++) n = 0;

 }

};

IT
Поделиться:
Популярные книги

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

О, мой бомж

Джема
1. Несвятая троица
Любовные романы:
современные любовные романы
5.00
рейтинг книги
О, мой бомж

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Сумеречный Стрелок 5

Карелин Сергей Витальевич
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 5

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки