Программирование на Visual C++. Архив рассылки
Шрифт:
После того, как мы вставим все эти проверки, наш список уже ничем не будет отличаться от выводимого Task Manager. Ниже приведен код функцииEnumApplications, которая реализует перечисление приложений. Интерфейс функции построен в стиле функций-перечислителей в Win32 API: она принимает указатель на пользовательскую функцию, которую вызывает для каждого перечисляемого приложения.
Как видно, функция EnumApplications чрезвычайно проста – она просто вызывает EnumWindows и вся основная работа по фильтрации ненужных окон ложится на вспомогательную
В функции EnumWindowsCallback мы сначала отсеиваем невидимые окна, и окна, имеющие владельца. Затем мы проверяем, не является ли данное окно окном рабочего стола. Здесь мы не уподобляемся разработчикам Windows NT Task Manager и используем имя класса окна для проверки. Наконец, мы отбрасываем окна с пустым заголовком.
После того, как мы определи, что данное окно представляет некоторое приложение, мы собираем информацию об окне, чтобы передать ее пользовательской функции. Сначала мы получаем заголовок окна с помощью хорошо известной функцииGetWindowText. Затем мы пытаемся получить иконку окна. Обратите внимание, мы используем функцию SendMessageTimeout с флагом SMTO_ABORTIFHUNG для посылки сообщения WM_GETICON. Это гарантирует, что наше приложение не зависнет, даже если приложение, которому принадлежит окно, перестало обрабатывать сообщения.
Когда все параметры определены, мы вызываем пользовательскую функцию. Пользовательская функция, в свою очередь, может распоряжаться этими данными по своему усмотрению. Например, в тестовом приложении Process Viewer, которое сопровождает эту статью, она добавляет очередной элемент в список приложений.
1. Q175030 HOWTO: Enumerate Applications in Win32, Microsoft Knowledge Base.
ФОРУМ RSDN – ИЗБРАННОЕ
Тема: ООП и наследование
Вопрос: Есть базовый класс, из ЕГО конструктора вызывается метод ЭТОГО же (базового) класса.
Так вот. Этот класс наследуют другие классы. НО! В их конструкторах нет вызова someFunction, – КОТОРАЯ ВИРТУАЛЬНАЯ, и по логике должна переназначаться классами, которые наследуют Cbase
Но при объявлении Csomefrombase : public Cbase, при объявлении объекта вызывается someFunction класса Cbase! Но нужно, чтобы вызывалась ТОЛЬКО Csomefrombase::someFunction!
Кто-нибудь подскажет, как решить данную проблему?
Предположим, всё работает по твоей логике. Угадай, что произойдёт вот в таком случае?