
- •1. Теоретична частина
- •1.1 Основи розробки додатків Windows
- •1.2 Головна функція WinMain
- •1.3 Параметри функції WinMain
- •1.4 Склад функції WinMain()
- •2. Практична частина
- •2. Відслідковувати кожен з процесів(його статус, назву, час життя).
- •2.3 Відслідковувати кожен з процесів(його статус, назву, час життя).
- •2.4 Відслідковувати діяльність користувача
- •2.5 Інші функції, використані в програмі
- •2.6 Опис алгоритму роботи програми
1.4 Склад функції WinMain()
У типовому додатку Windows головна функція WinMain() повинна виконати щонайменше 3 важливі процедури:
-
Зареєструвати в системі Windows клас головного вікна. Якщо крім головного вікна планується виводити на екран внутрішні, породжені вікна, то їх класи також необхідно зареєструвати. Windows виводить на екран і обслуговує тільки зареєстровані вікна.
-
Створити головне вікно і показати його на екрані. Породжені вікна також необхідно створити, хоча це можна зробити і пізніше, і не обов'язково у функції WinMain().
-
Організувати цикл виявлення повідомлень, що надходять в додаток, а також додаток повідомлень. Запущене застосування Windows зазвичай функціонує доти, поки користувач не подасть команду його завершення за допомогою системного меню або введенням команди Alt + F4. Ці дії призводять до завершеня головної функції і видаленню програми зі списку діючих завдань.
Клас вікна і його характеристики
Для виводу на екран будь-якого вікна, зокрема головного вікна програми, необхідно насамперед зареєструвати клас вікна, в якому задаються найбільш загальні характеристики всіх вікон даного класу. Ця дія виконується в першій частині функції WinMain ().
Дії з реєстрації класу вікна полягають у заповненні структури типу WNDCLASS, що служить для опису характеристик класу реєстрованого вікна, і визові потім функції Windows RegisterClass (), яка і виконує реєстрацію даного класу.
Структура WNDCLASS, визначена у файлі WINUSER.H, містить ряд членів, які задають найбільш загальні характеристики вікна.
При заповненні структурної змінної типу WNDCLASS необхідно забезпечити нульове значення всіх елементів, яким не присвоюється конкретні значення. Нульове значення елемента структури позначає для Windows, що характеристики цього елемента повинні встановлюватися за замовчуванням. Це правило, до речі, характерно і для інших структур, що описують ті чи інші об'єкти Windows, наприклад для структури OPENFILENAME, що служить для виводу на екран стандартного діалогу Windows "Відкриття файлу", йди структури LOGFONT, що дозволяє створити шрифт необхідного начертання.
Можна не обнуляти структуру Msg явним чином, а скористатися тією обставиною, що глобальні змінні обнуляються автоматично. Якщо змінну wc розташувати перед функцією WinMain, то при завантаженні програми в пам'ять вона буде заповнена нулями і у виклику функції ZeroMemory не буде необхідності. Якщо деяка змінна потрібна тільки в конкретній функції, її краще оголосити всередині цієї функції і зробити тим самим локальної. Локалізація змінних зменшує витрату пам'яті і підвищує надійність програми. Так чи інакше, якийсь засіб обнулення використовувати необхідно; в іншому випадку структура виявиться заповненою "сміттям", що при запуску програми швидше за все призведе до драматичних наслідків.
Найбільш важливими для подальшого функціонування програми є три поля структурної змінної wc: hlnstance, де зберігається дескриптор даного додатку, IpszClassName, куди заноситься довільне ім'я, присвоєне нами вікнам даного класу (у нас це вікно єдине) і lpfhWndProc - ім'я віконної функції. Саме за допомогою структури WNDCLASS Windows, визначає адресу віконної функції, яку вона повинна викликати при вступі у вікно повідомлень. Поле IpszClassName заповнюється із змінної szClassName; визначеної на початку програми, а значення дескриптора додатки переноситься з параметра hlnst функції WinMain ().
Менш важливими в принциповому плані, але істотними для розумного поведіння додатки є поля hIcon, hCursor і hbrBackground, куди слід записати дескриптори піктограми, курсору і кисті, яка використовується для зафарбовування робочої області вікна.
Курсор відноситься до ресурсів Windows; ресурси зазвичай завантажуються з спеціально створеного файлу ресурсів за допомогою відповідних функцій Windows, зокрема LoadCursor(). В якості першого аргументу цих функцій вказується дескриптор додатки, в якому зберігається необхідний ресурс, а в якості другого - ім'я ресурсу. Однак можна обійтися і вбудованими ресурсами Windows. Для цього в якості першого аргументу цих функцій вказується NULL (зазвичай NULL на місці дескриптора додаток позначає саму систему Windows); другий аргумент треба вибрати зі списку вбудованих ресурсів Windows.
Іншим ресурсом Windows, вказуються у класі вікна, є піктограма. Як і курсор, піктограма може бути розроблена програмістом спеціально для цього додатка і зберігатися у файлі ресурсів застосування або в окремому файлі з розширенням ІСО.
Для того щоб додати додатку необхідну піктограму, треба при заповненні структурної змінної wc типу WNDCLASS завантажити дескриптор піктограми в елемент wc.hIcon. Для отримання дескриптора слід скористатися функцією LoadIcon().
Колір фону вікна визначається дескриптором кисті, записаним в структуру WNDCLASS. В принципі кисті можна надати будь-який колір, але найпростіше користуватися однією з вбудованих кистей, що зберігаються на "складі" windows. Для отримання вбудованої кисті слід скористатися макросом getStockBrash(), в якості єдиного аргументу якого вказується константа, що характеризує колір кисті. Можливі значення констант (їх дуже небагато).
Для створення кисті служить функція CreateSolidBrush(), в якості єдиного параметра якій вказується необхідний колір у вигляді трьох чисел, який характеризує інтенсивність червоною, зеленою і синій складових кольору. Для упаковки цих трьох чисел в одне 4-байтовий слово і перетворення отриманого значення в тип COLORREF, необхідний функцією CreateSolidBrush, служить макрос RGB().
Стиль є ціле число (32 біта), окремі біти якого закріплені за тими чи іншими загальними характеристиками всіх вікон, які належать класу, який зареєстрований; кожному біту відповідає своя символічна константа. Так, установка біта 3 дозволяє програмі реагувати на подвійні клацання мишею в області вікна; установка бітів 0 і змушує Windows перемальовувати вікно заново при кожній зміні його розмірів по горизонталі і вертикалі; установка біта 9 забороняє закриття вікна користувачем і т.д.
Функція RegisterClass() вимагає в якості аргументу адресу структурної змінної типу WNDCLASS.
Зареєструвавши клас вікна, можна приступити до його створення і виведення на Робочий стіл.
Створення і показ вікна
Для створення вікна, зокрема головного вікна програми, використовується функція Windows CreateWindow(), прототип якої можна знайти в інтерактивному довіднику.
Істотними елементами прототипу є порядок і типи параметрів; вказівка в довіднику та необов'язкову рекомендацію. У програмі строка з ім’ям класу вікна названа szClassName, рядок із заголовком вікна – szTitle, а в якості параметрів використані символічні або числові константи.
Перший параметр IpClassName - адреса рядка з ім'ям реєстрованого класу вікна. Передача функції CreateWindow() імені класу дозволяє використовувати при створенні вікна ті загальні характеристики вікна, які були визначені в структурі WNDCLASS, наприклад форму курсора і колір фону. Викликаючи функцію CreateWindow() багаторазово, можна створити багато вікон даного класу, що розрізняються, наприклад, розмірами і розташуванням на екрані.
Параметр IpWindowName визначає адресу рядки з заголовком, який з'явиться у верхній частині вікна.
Параметр dwStyle визначає стиль вікна. За допомогою стилю задаються такі характеристики вікна, як вид навколишнього його рамки, наявність або відсутність рядка заголовка і цілий ряд інших. Стиль є ціле число (32 біта), окремі біти якого закріплені за тими чи іншими елементами оформлення або властивостями вікна; кожному біту відповідає своя символічна константа. Так, установка біта 18 надає вікну товсту рамку; установка біта 19 постачає вікно системним меню; біт 21 відповідає за появу лінійки вертикальної прокрутки і т.д. операція побітового АБО (знак |) дозволяє "набрати" необхідний комплект властивостей.
Зазвичай головне вікно описується константою WS_OVERLAPPEDWINDOW. Якщо потрібно створити головне вікно з меншою кількістю елементів, весь необхідний набір можна вказати явним чином.
З іншого боку, скориставшись операторами побітових операцій І (&) і НЕ (~), можна не набирати заново всю комбінацію констант, а просто виключити НЕ-потрібний елемент WS_MAXHMlZEBOX з повного набору:
WS OVERLAPPEDWINDOW & -WS MAXIMIZEBOX
Наступні 4 параметри визначають х- і у-координати лівого верхнього кута вікна відносно початку Робочого столу і розміри вікна по горизонталі і вертикалі (в пік-селах).
Як параметр hWndParent вказується дескриптор батьківського вікна. Для головного вікна, у якого немає батька, використовується константа HWND_ DESKTOP.
Параметр hMenu дозволяє задати меню вікна. Якщо меню немає (як у нашому випадку) або використовується меню класу, задане в структурі WNDCLASS, цей параметр повинен бути рівний нулю (MULL).
Параметр hlnstance ідентифікує екземпляр додатку. Значення дескриптора додатки було отримано нами через параметр hlnst функції WinMainQ.
Останній параметр IpParam є адресою додаткових даних, які зазвичай не потрібні.
Символічне позначення NULL (нуль-покажчик) використовується в тих випадках, коли для деякої функції треба вказати нульове значення параметра.
Функція CreateWindow () при успішному виконанні повертає дескриптор утвореного вікна. Цей дескриптор передається в функцію ShowWindow(), котра організує виведення створеного вікна на екран. Тепер для правильного функціонування додатку необхідно організувати цикл повідомлень.
Цикл виявлення повідомлень
Цикл виявлення повідомлень в найпростішому вигляді складається з одного
У цьому нескінченному (якщо його не розірвати зсередини) циклі викликається функція Windows GetMessage (), і, якщо вона повертає нульове значення, викликається функція DispatchМеssаgе(). Призначення циклу обробки повідомлень - отримання повідомлень, що надходять в додаток, і виклик у відповідь на кожне повідомлення віконної процедури для обробки цього повідомлення.
Якщо протягом якогось часу повідомлення в додаток не надходять, цикл обробки повідомлень "крутиться" вхолосту. Як тільки у черзі виявляється повідомлення, функція GetMessage забирає його з черги і переносить в структурну змінну, призначену для прийому повідомлень. Викликається далі функція DispatchMessage() викликає віконну процедуру того вікна, якому призначено дане повідомлення, і передає їй (через її параметри) вміст повідомлення зі структури Msg. Завдання віконної процедури - виконати необхідну обробку повідомлення. Коли віконна процедура завершить обробку отриманого повідомлення, управління повернеться в цикл обробки повідомлень, який продовжить своє циклічне виконання в очікуванні нового повідомлення.