Міністерство освіти, науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсова робота
з предмету: «Системне програмне забезпечення»
на тему: «Програма контролю та керування енергоспоживанням у Windows 7»
Підготував: ст. гр. КІ-35
Прийняв: асис. каф. ЕОМ
Грицик І.В.
Львів 2015
Завдання на курсову роботу
Розробити програму контролювання та керування енергоспоживанням портативних ПК з операційною системою Windows 7 з наступними функціями:
Управління яскравістю екрану;
Перегляд заряду батареї;
Отримання часу до повної розрядки батареї;
Отримання планів енергоспоживання;
Зміна плану енергоспоживання.
Програма повинна використовувати стандартні бібліотеки класів платформи .NET і WinApi функції.
Анотація
В курсовій роботі була розроблена програма контролю та керування енергоспоживанням у Windows 7, вона дозволяє переглядати стан батареї, контролювати яскравість екрану, виводи інформацію про план електроживлення і змінювати його. Програма визначає чи підключений зарядний пристрій, скільки часу залишилось до повної розрядки батареї .
Програма була розроблена за допомогою Microsoft Visual Studio 2013 і працює на базі платформи .NET з використанням WinApi функцій, а також використовує бібліотеку написану на С++.
Annotation
In this course work has developed a program of control and power management in Windows 7, it allows you to view battery status, monitor screen brightness, displays information about power plan and modify it. The program determines whether the connected charger, the remaining time to the full battery discharge.
The program was developed using Microsoft Visual Studio 2013 and is based on .NET platform using WinApi functions and uses a library written in C ++.
Зміст
Вступ 6
1. Огляд методів управління енергозбереженням Windows 8
2. Вибір технології програмування 13
3. Розробка програми 17
3.1. Розробка вузла керування яскравістю екрану 18
3.2. Розробка вузла виведення інформації про стан батареї 20
3.3. Розробка вузла виводу даних про план енергоспоживання 21
3.4. Розробка вузла зміни плану енергоживлення 22
4. Опис інтерфейсу та інструкції користувача 23
5. Тестування 24
5.1. Виявлення помилок зміни яскравості екрану 25
5.2. Виявлення помилок зміни плану енергоживлення 27
5.3. Виявлення помилок коректного відображення стану батареї 28
Висновок 30
Список літератури 31
Додаток. Лістинг програми 32
DLL……………………………………………………………………………...32
Інтерфейс 38
Вступ
Ноутбук дозволяє працювати практично завжди і скрізь. За винятком самих екстремальних ситуацій, наприклад у сильну спеку, або під проливних дощем. Хоча для таких випадків існують спеціальні захищені комп'ютери, які випускаються деякими фірмами, наприклад Panasonic і Getac.
Як можна зрозуміти, ноутбук - універсальний засіб. Звичайно, можна сперечатися, що ноутбуки не годяться для повноцінної заміни ігрових комп'ютерів або спеціалізованих робочих станцій. Але такі пристрої – приватний для використання випадок комп'ютера. Перші потрібні в основному «хардкорним» гравцям, або технікам, які прагнуть поставити на свій комп'ютер найсучасніше «залізо», другі призначені для вирішення вузькоспеціалізованих завдань, наприклад обробки векторної та растрової графіки, монтажу відеофільмів і так далі.
У переважній більшості, сучасні комп'ютери вже досягли такої продуктивності, що жодним чином не можуть прискорити продуктивність праці: найпотужніший процесор не допоможе користувачеві швидше набирати текст на клавіатурі, найсучасніша відеокарта з останніх новинок не стане показувати робочий стіл гарніше, ніж це може відеокарта, випущена в минулому році.
Дуже часто домашні комп'ютери використовуються як розважальний центр: "ходіння" по Інтернету, прослуховування музики, перегляд фільмів, прості аркадні (так звані казуальні) ігри. Для того щоб впоратися з такими завданнями, згодиться комп'ютер початкового рівня.
Виробники комп'ютерного обладнання, звичайно ж, звернули увагу на такий стан речей, і стали пропонувати відповідне обладнання, наприклад компанія Intel представила платформу Atom, яка з успіхом використовується в найменших портативних комп'ютерах, відомих як нетбуки.
Величезний успіх цих самих нетбуків, випуск яких налагодили останнім часом навіть відомі виробники, дозволив портативним комп'ютерам обігнати по продажах стаціонарні комп'ютери.
Плюс до всього, портативний комп'ютер може використовуватися як абсолютно незалежний пристрій, тобто буде працювати без зовнішнього живлення, без миші, та й займає набагато менше місця на робочому столі. Додам, що найчастіше покупка ноутбука відбувається просто тому, що це модно. Модно мати сучасний гаджет. Багато таких пристроїв, навіть від різних виробників, часто відрізняються тільки зовнішнім виглядом. До того ж вартість простого ноутбука цілком порівнянна з вартістю не дуже потужного настільного комп'ютера.
Таким чином, загальна тенденція до «мобілізації» комп'ютерів змушує користувача задуматися про те, які зручності операційної системи Windows 7 допоможуть у використанні мобільних комп'ютерів, як вдома, так і в дорозі.
1. Огляд методів управління енергозбереженням Windows
Центр мобільності Windows
Центр мобільності, доступний тільки на портативних комп'ютерах, забезпечує централізоване управління деякими важливими функціями мобільного пристрою з інтерфейсу єдиного користувача. Для запуску Центру мобільності слід натиснути комбінацію клавіш Win + X (рис. 1).
Рис. 1. Центр мобільності Windows
Яскравість. Повзунком можна змінювати яскравість екрану. Рекомендується зменшувати яскравість при роботі від батареї для зниження енергоспоживання.
Гучність. Використовується повзунок для зміни гучності динаміків. Відмітка чекбокса «Без звуку» - цілком вимкнути звук (режим Mute).
Стан батареї. Дозволяє відстежувати рівень заряду батареї для визначення часу роботи, а також змінювати план електроживлення.
Бездротова мережа. Перевірка стану підключення до бездротової мережі, а також включення/виключення бездротового адаптера.
Обертання дисплея. Якщо використовується Windows 7 на планшетний ПК, використовуючи цей параметр, можна на льоту змінювати орієнтацію екрану з книжкової на альбомну і навпаки.
Зовнішній дисплей. Підключення додаткового монітора до портативного комп'ютера або настроювання властивостей дисплея.
Центр синхронізації. Перегляд стану синхронізації, запуск синхронізації або настроювання нового зв'язку з пристроєм. Також забезпечує доступ до налаштувань властивостей Центру синхронізації.
Параметри презентації (рис. 2). Дозволяє включати режим презентації. Коли комп'ютер перебуває в цьому режимі, відключаються різні системні повідомлення, збереження екрану. Так само в цьому режимі вимикається режим сну і сну по тайм-ауту (функція не доступна в домашніх версіях операційної системи).
Рис. 2. Налаштування властивостей режиму Презентації
Гнучка настройка функції управління живленням в стартовому меню
У Windows Vista головна кнопка управління відповідала живленням за виключення комп'ютера. Для виклику інших режимів, слід було натиснути додаткову кнопку, після чого з нового меню, вибрати потрібну функцію. У Windows XP викликалося окреме вікно вибору режиму: вимикання, сон і так далі. У Windows 7 головну кнопку можна налаштувати за своїм бажанням. Для цього треба натиснути правою кнопкою миші на панелі завдань, відкрити Властивості і перейти на закладку Меню "Пуск". На цій закладці можна встановити дію кнопки живлення.
Плани електроживлення
Основною функціональною відмінністю мобільного комп'ютера від стаціонарного є наявність вбудованої батареї. Саме вона дозволяє працювати з мобільним пристроєм практично де завгодно. Але, як відомо, не існує вічного джерела живлення. І заряд батареї обмежений. Тому, в портативних комп'ютерах слід знаходити компроміс між необхідною продуктивністю і часом автономної роботи. Кожна частина такого комп'ютера споживає енергію: лампа дисплея, пристрій читання дисків, жорсткий диск, адаптер бездротового зв'язку. Бажано, щоб при всьому цьому, портативний комп'ютер працював якомога довше: робота через мережу Інтернет або робота з локальними документами, прослуховування музики або перегляд відео.
Найпростіша річ, яку слід зробити для цього, у разі не можливості підключення до мережі живлення тривалий час - вибрати план електроспоживання «Економія енергії». Крім цього, при відключенні від електромережі, Windows 7 автоматично перемкне функцію Aero з режиму скла в Standart.
Кожен з використовуваних планів електроживлення можна гнучко налаштувати. Поведінка жорсткого диска при роботі від мережі і від батареї, запит пароля при пробудженні комп'ютера, параметри фону робочого столу і багато іншого.
Також можна створити абсолютно новий план електроживлення, або змінити існуючий для включення/виключення необхідних параметрів.
Пошук проблем енергоспоживання
Насправді, те, що легко налаштувати з використанням графічного меню, можна налаштувати за допомогою консольної утиліти powerсfg.exe. Тонкощі роботи з цією утилітою розглядатися не будуть, все ж таки робота з нею не є простою справою. Але існує одна чудова функція цієї утиліти, яка допоможе знайти проблемні місця в роботі ноутбука і посприяє більш тонкій настройці планів електроживлення.
Для запуску утиліти слід запустити командну консоль з правами Адміністратора. Для цього потрібно ввести «cmd» в полі Швидкого пошуку. У результатах вибрати cmd.exe з розділу Програми, натиснути по ньому правою кнопкою миші і вибрати пункт «Запуск від імені Адміністратора»(якщо робота відбувається від імені Користувача, потрібно буде ввести пароль Адміністратора) (рис. 3). Відкриється командна консоль з підвищеними правами.
Рис. 3. Запуск командної консолі з правами адміністратора
У нашому випадку, файл був створений в корені диска D: і називається energy_report.html.
Відкривши цей файл за допомогою Google Chrome, можна переглянути звіт про проблеми з енергоспоживанням та рекомендації щодо їх усунення (рис. 4).
Рис. 4. Файл-звіт про діагностику ефективності енергоспоживання
2. Вибір технології програмування
C++ - типізована мова програмування загального призначення. Підтримуючи різні парадигми програмування, поєднує властивості як високорівневих, так і низькорівневих мов. У порівнянні з його попередником - мовою C, - найбільшу увагу приділено підтримці об'єктно-орієнтованого та узагальненого програмування.
Будучи одним із найбільш популярних мов програмуванн, C++ широко використовується для розробки програмного забезпечення. Область його застосування включає створення операційних систем, різноманітних прикладних програм, драйверів пристроїв, додатків для вбудованих систем, високопродуктивних серверів, а також розважальних програм. Існує декілька реалізацій мови C++ - як безкоштовних, так і комерційних. Їх виробляють Проект GNU, Microsoft, Intel і Embarcadero (Borland). C++ зробила величезний вплив на інші мови програмування, в першу чергу на Java і C #. При створенні C++ Бьєрн Страуструп прагнув зберегти сумісність з мовою C. Безліч програм, які можуть однаково успішно транслюватися як компіляторами C, так і компіляторами C++, досить велика - почасти завдяки тому, що синтаксис C++ був заснований на синтаксисі C.
Стандарт C++ на 2003 рік складається з двох основних частин: опис ядра мови і опис стандартної бібліотеки. Крім того, існує величезна кількість бібліотек C++, що не входять в стандарт. У програмах на C++ можна використовувати багато бібліотек C. Стандартизація визначила мову програмування C++, проте за цією назвою можуть ховатися також неповні, обмежені, достандартні варіанти мови. Спочатку мова розвивалася поза формальними рамками, спонтанно, у міру вставали перед ним завдань. Розвитку мови сприяв розвиток кросс-компілятора cfront. Нововведення в мові відбивалися в зміні номера версії кросс-компілятора.
C++ - надзвичайно потужна мова, що містить засоби створення ефективних програм практично будь-якого призначення, від низькорівневих утиліт і драйверів до складних програмних комплексів самого різного призначення. Зокрема:
Підтримуються різні стилі та технології програмування, включаючи традиційне директивне програмування, ООП, узагальнене програмування, метапрограмування(шаблони,макроси).
Передбачуване виконання програм є важливим достоїнством для побудови систем реального часу. Весь код, неявно генерований компілятором для реалізації мовних можливостей (наприклад, при перетворенні змінної до іншого типу), визначений у стандарті.
Мова підтримує поняття фізичної (const) і логічної (mutable) константності. Це робить програму надійніше, тому що дозволяє компілятору, наприклад, діагностувати помилкові спроби зміни значення змінної.
Ефективність. Мова спроектована так, щоб дати програмістові максимальний контроль над усіма аспектами структури і порядку виконання програми.
Є можливість роботи на низькому рівні з пам'яттю, адресами.
Win32 API (розшифровується як інтерфейс прикладних програм) - це множина підпрограм-функцій, на яких побудована операційна система WINDOWS, яка використовує 32х-бітну адресацію, починаючи з WINDOWS 95 і закінчуючи WINDOWS XP. Розробники WINDOWS зробили багато зусиль щоб стандартизувати як назви функцій, так і їх параметри. Тому використовувати їх не так важко, якщо засвоїти деякі загальні концепції.
Більшість функцій доступні для програм користувача, які написані для Windows на будь-якій мові програмування (у тому числі і на асемблері). Множина цих функцій розширюється при переході до наступної версії Windows, таким чином, забезпечується сумісність розроблених раніше програм із новими версіями операційної системи. Існують і функції, які не відображені в документації, або для свого застосування вимагають від програми спеціальних прав доступу до пам'яті.
Суть функцій API зрозуміти значно легше, якщо уявити, з яких файлів вони викликаються і на які групи ці функції поділяються. Асемблер - це як раз той зручний і простий засіб, який дозволить вам звертатись безпосередньо до будь-якої функції API, що знаходиться у DLL-файлі.
Секрет пізнання операційної системи через програмування на асемблері полягає у тому, що сам асемблер не накладає жодних обмежень на програму та дані, з якими вона працює. Це повинен робити сам програміст з метою захисту операційної системи від своїх некоректних дій. Таким чином, основною метою системного програмування є написання коректних програм з необмеженими можливостями (в рамках операційної системи).
Мова C#
Синтаксис C# дуже виразний, але простий у вивченні. Усі, хто знайомий з мовами C, C++ або Java з легкістю дізнаються синтаксис з фігурними дужками, характерний для мови C#. Розробники, які знають будь-яку з цих мов, як правило, зможуть добитися ефективної роботи з мовою C# за дуже короткий час. Синтаксис C# робить простіше те, що було складно в C++, і забезпечує потужні можливості, такі як типи значень Nullable, перерахування, делегати, лямбда-вирази і прямий доступ до пам'яті, чого немає в Java. C# підтримує універсальні методи і типи, забезпечуючи більш високий рівень безпеки і продуктивності, а також ітератори, що дозволяють при реалізації колекцій класів визначати власну поведінку ітерації, яке може легко використовуватися в клієнтському коді. Вирази LINQ (Language-Integrated Query) роблять суворо типізований запит дуже зручною мовною конструкцією.
Як об'єктно-орієнтована мова, C# підтримує поняття інкапсуляції, успадкування та поліморфізму. Всі змінні і методи, включаючи метод Головна точку входу до програми - визначення класів. Клас інкапсулюються може успадковувати безпосередньо з одного родового класу, але може реалізовувати будь-яке число інтерфейсів. У Для , які перевизначають віртуальні методи в батьківському класі, необхідно ключове слово перевизначити, щоб виключити випадкове повторне визначення. методів У мові C# структура схожа на полегшений клас: це тип, що розподіляється по стопках, який реалізує інтерфейси, але не підтримує спадкування.
На додаток до основних описаним об'єктно-орієнтованим принципам, мова C# спрощує розробку компонентів програмного забезпечення завдяки кільком інноваційним конструкціям мови, до числа яких входять наступні:
Інкапсульовані сигнатури методів, звані делегатами, які підтримують типобезпечне повідомлення про події.
Властивості, що виступають в ролі методів доступу для закритих змінних-членів.
Атрибути з декларативними метаданими про типи під час виконання.
Вбудовані коментарі XML-документації.
LINQ (Language-Integrated Query), що пропонує вбудовані можливості запитів у різних джерелах даних.
Якщо буде потрібно забезпечити взаємодію з іншим програмним забезпеченням Windows, таким як об'єкти COM або власні бібліотеки DLL Win32, в мові C# можна використовувати процес, який називається «взаємодії». Процес взаємодії дозволяє програмам на C# виконувати практично будь-які дії, які може виконувати вихідне додаток на C++. Мова C# підтримує навіть покажчики і поняття «небезпечного» коду для тих випадків, коли прямий доступ до пам'яті має вкрай важливе значення.
Процес побудови C# в порівнянні з C і C++ простий і є більш гнучким, ніж в Java. Немає окремих файлів заголовка, а методи і типи не потрібно оголошувати в певному порядку. У вихідному файлі C#, може бути визначено будь-яке число класів, структур, інтерфейсів і подій.
3. Розробка програми
Дана програма має такі основні функціональні вузли:
- Керування яскравістю екрану.
- Виведення інформації про стан батареї.
- Виведення інформації про стан плану енергоспоживання
- Зміна плану енергоспоживання.
Вузол «Керування яскравістю екрану» дозволяє користувачеві зменшити або збільшити яскравість екрану відповідно, якщо збільшити яскравість батарея розрядиться швидше, якщо зменшити – повільніше.
Вузол «Виведення інформації про стан батареї» виводить інформацію про батарею, чи заряджається вона чи ні, скільки часу залишилось до повної розрядки батареї.
Вузол «Стан плану енергоспоживання» звертається до реєстру, вибирає дані про стани енергоспоживання і виводить їх користувачеві.
Вузол «Зміна плану енергоспоживання» звертається до системи і відправляє запит на зміну плану енергоспоживання.
3.1. Розробка вузла керування яскравістю екрану
Керування яскравістю екрану передбачає звернення до gdi32.dll і встановлення коефіцієнту яскравості системи.
Розробка граф-схеми алгоритму вузла керування яскравістю екрана наведено на рисунку 5.
Рис. 5. Граф-схема алгоритму вузла
керування яскравістю екрана
Блок 1 – Початок роботи вузла
Блок 2 – Підключення «gdi32.dll».
Блок 3 – Виклик функції для отримання поточного стану яскравості екрано.
Блок 4 – Зміна поточного стану яскравості шляхом зміни коефіцієнту.
Блок 5 – Встановлення зміненої яскравості екрану.
Блок 6 – Завершення роботи вузла.
Для того, щоб отримати коефіцієнт яскравості використовується функція
pGetDeviceGammaRamp = (Type_SetDeviceGammaRamp)GetProcAddress(hGDI32, "GetDeviceGammaRamp");
Для зміни яскравості екрану використовується:
pSetDeviceGammaRamp = (Type_SetDeviceGammaRamp)SetProcAddress(hGDI32, "SetDeviceGammaRamp");
3.2. Розробка вузла виведення інформації про стан батареї
Для того, щоб отримати дані про стан батареї використовуються WinApi функції для роботи з батареєю. Розробка граф-схеми алгоритму вузла перегляду сервісів наведено на рисунку 6.
Рис. 6. Граф-схема алгоритму вузла виведення
інформації про стан батареї
Блок 1 – Початок роботи вузла
Блок 2 – Отримання статусу зарядки Power on/off.
Блок 3 – Отримання рівня заряду.
Блок 4 – Отримання рівня заряду у відсотках.
Блок 5 – Обрахунок часу до повної розрядки батареї.
Блок 6 – Обрахунок часу максимального часу роботи від батареї.
Блок 7 – Завершення роботи вузла.
Для отримання списку всіх сервісів використовуються WinApi функції GetSystemPowerStatus(&sps);
sps.ACLineStatus
sps.BatteryFlag
sps.BatteryLifePercent
sps.BatteryLifeTimesps.
BatteryFullLifeTime
3.3. Розробка вузла виводу даних про план енергоспоживання
Даний вузол звертається до реєстру Windows і отримує дані про стан енергоспоживання. Доступ до реєстру забезпечується функціями стандартної бібліотека .NET. Розробка граф-схеми алгоритму інформації про стан енергозбереження наведено на рисунку 7.
Рис. 7. Граф-схема алгоритму вузла виведення
інформації про стан енергоспоживання
Блок 1 – Початок роботи вузла
Блок 2 – Отримання доступу до реєстру Windows
Блок 3 – Відкриття гілки яка відповідає за план енергоспоживання
Блок 4 – Отримання планів енергоспоживання
Блок 5 – Отримання активного плану енергоспоживання
Блок 6 – Завершення роботи з реєстром
Блок 7 – Завершення роботи вузла.
Щоб отримати дані про план енергоспоживання використовується:
RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes");
string[] powers = Key.GetSubKeyNames();
Active = (string)Key.GetValue("ActivePowerScheme");
3.4. Розробка вузла зміни плану енергоживлення
Для того, щоб змінити план енергоживлення використовується системна утиліта Powercfg
Розробка граф-схеми алгоритму зміни плану енергоживлення наведено на рисунку 8.
Рис. 8. Граф-схема алгоритму вузла
зміни плану енергоживлення
Блок 1 – Початок роботи вузла
Блок 2 – Отримання поточного плану енергоживлення.
Блок 3 – Вибір нового плану з переліку можливих.
Блок 4 – Отримання доступу до утиліти Powercfg.
Блок 5 – Зміна поточного плану з допомогою утиліти Powercfg.
Блок 6 – Завершення роботи вузла.
Щоб змінити поточний план енергоживлення використовується:
Active = (string)pow[rb.Text];
ProcessStartInfo prc = new ProcessStartInfo("Powercfg", "-setactive " + Active);
prc.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(prc);
4. Опис інтерфейсу та інструкції користувача
Програму контролю та керування енергоспоживанням у Windows 7 можна запустити з виконавчого файлу EnergyBrightness.exe. Для її запуску необхідно платформу.NET 2.0 та бажано Windows 7, встановлений на портативний ПК.
Дана програма є досить простою у використанні.
Рис. 9. Ескіз вікна розробленої програми контролю та
керування енергоспоживанням у Windows 7
В програмі приступні наступні функції:
Зміна яскравості екрану
Зміна плану енергоживлення
Відображення інформації про батарею.
Керування яскравістю екрану відбувається з допомогою рухомого повзунка, перетягуючи його в ліву частину яскравість зменшується, а в праву – збільшується.
Вибір плану енергоспоживання відбувається з допомогою перемикачів, кожному перемикачеві відповідає один план енергоживлення.
Блок відображення стану батареї є дуже простим і інформативним він швидко реагує на всі зміни пов’язані з роботою батареї.
5. Тестування
Відлагодження програми відбувається на основі спеціально створених тестів за допомогою автоматизованого відлагоджувача який присутній в середовищі Microsoft Visual Studio 2013. В покроковому режимі перевіряється значення потрібних змінних і вмістиме потрібних структур даних. За допомогою breakpoints відбувається зупинка виконання програми в тих місцях, де відбулася логічна помилка або в місцях, визначених студентом.
5.1. Виявлення помилок зміни яскравості екрану
Цей етап відносяться до помилок у зміні яскравості екрану.
Рис. 10. Вікно програми з нормальним режимом яскравості
Якщо перетягнути повзунок вліво, то яскравість зменшиться (рис. 11).
Рис. 11. Вікно програми із зменшеним режимом яскравості
Якщо перетягнути повзунок вправо, яскравість збільшиться (рис. 12).
Рис. 12. Вікно програми із збільшеним режимом яскравості
5.2. Виявлення помилок зміни плану енергоживлення
Цей етап відносяться до помилок некоректної зміни плану енергоспоживання.
Рис. 13. Вікно відображення поточного плану
Рис. 14. Вікно відображення зміненого плану
Як видно зміна плану пройшла успішно і даний блок працює коректно. У другому випадку комп’ютер перейшов на спрощений режим оформлення у відповідності з вибором плану електроживлення «Сверхнизкое энергопитание».
5.3. Виявлення помилок коректного відображення стану батареї
Цей етап відносяться до помилок отримання коректних даних про стан батареї. На рис. 15 програма показує, що батарея заряджається (тобто живлення підключено).
Рис. 15. Вікно програми при підключеному електроживленні
Якщо відключити живлення, програма відреагує на зміни і оновить свої дані (рис. 16).
Рис. 16. Вікно програми при відключеному електроживленні
Програма починає відображати час, через який батарея розрядиться, відсоток заряду та відповідно до цього відсотка індикатор заряду, який змінюватиметься в залежності від діапазону відсотка заряду (рис. 17).
Рис. 17. Варіанти відображення батареї,
в залежності від відсотка заряду
На випадок якщо батарея у пристрої відсутня, можна побачити ось таке забавне зображення:
Рис. 18. Вікно програми при відсутності батареї
Висновок
Під час створення програмного продукту я навчився навичкам роботи з енергоспоживанням у портативних ПК.
На початкових стадіях розробки було проведено аналіз задачі проекту та розроблено граф-схеми роботи програмного продукту. Наступні етапи проектування, використовуючи загальнотеоретичні положення сформульовані на ранніх стадіях синтезу, реалізовували проект на програмному рівні.
У курсовій роботі була розроблена програма контролю та керування енергоспоживанням у Windows 7 з можливістю роботи з екраном і батареєю портативних ПК. Також було проведене тестування всіх модулів, яке підтвердило, що весь код, який міг призвести до помилок опрацьований і програма працює коректно.
Під час виконання курсової роботи було успішно засвоєно методи розробки системних програм, а зокрема програми керування енергозбереженням.
Список літератури
В. Зиборов Visual C# 2010 на примерах
Системное программное обеспечение / А.В.Гордеев, А.Ю.Молчанов.
Э. Троелсен Язык программирования C# 2010 и платформа .NET 4.0
Колисниченко Секреты, настройка и оптимизация реестра Windows 7
Дж.Донован. Системное программирование.
Шефферд Дж. Программирование на Microsoft Visual C++ .NET – Русская редакция;
http://www.osp.ru/win2000/2011/06/13009935/
http://cppstudio.com/post/9384/
http://www.cyberforum.ru/win-api/thread679607.html
https://msdn.microsoft.com/ru-ru/library/ms123401.aspx
Додаток. Лістинг програми
DLL
brightness.h
#include <Windows.h>
#include <string.h>
extern "C" __declspec(dllexport) char * GetPowerStatus();
extern "C" __declspec(dllexport) char * GetBatteryFlag();
extern "C" __declspec(dllexport) int GetBatteryPercent();
extern "C" __declspec(dllexport) int GetBatteryTime();
extern "C" __declspec(dllexport) int GetFullBatteryTime();
gammaramp.h
#include <Windows.h>
#ifndef GAMMARAMP_H_
#define GAMMARAMP_H_
/*
CGammaRamp class
Encapsulates the Gamma Ramp API and changes the brightness of
the entire screen.
Written by Nir Sofer.
http://www.nirsoft.net
*/
class CGammaRamp
{
protected:
HMODULE hGDI32;
HDC hScreenDC;
typedef BOOL (WINAPI *Type_SetDeviceGammaRamp)(HDC hDC, LPVOID lpRamp);
Type_SetDeviceGammaRamp pGetDeviceGammaRamp;
Type_SetDeviceGammaRamp pSetDeviceGammaRamp;
public:
CGammaRamp();
~CGammaRamp();
BOOL LoadLibrary();
void FreeLibrary();
BOOL LoadLibraryIfNeeded();
BOOL SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL GetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL SetBrightness(HDC hDC, WORD wBrightness);
};
#endif
GammaRamp.cpp
#include <windows.h>
#include "gammaramp.h"
CGammaRamp::CGammaRamp()
{
//Initialize all variables.
hGDI32 = NULL;
hScreenDC = NULL;
pGetDeviceGammaRamp = NULL;
pSetDeviceGammaRamp = NULL;
}
CGammaRamp::~CGammaRamp()
{
FreeLibrary();
}
BOOL CGammaRamp::LoadLibrary()
{
BOOL bReturn = FALSE;
FreeLibrary();
//Load the GDI library.
hGDI32 = ::LoadLibrary("gdi32.dll");
if (hGDI32 != NULL)
{
//Get the addresses of GetDeviceGammaRamp and SetDeviceGammaRamp API functions.
pGetDeviceGammaRamp = (Type_SetDeviceGammaRamp)GetProcAddress(hGDI32, "GetDeviceGammaRamp");
pSetDeviceGammaRamp = (Type_SetDeviceGammaRamp)GetProcAddress(hGDI32, "SetDeviceGammaRamp");
//Return TRUE only if these functions exist.
if (pGetDeviceGammaRamp == NULL || pSetDeviceGammaRamp == NULL)
FreeLibrary();
else
bReturn = TRUE;
}
return bReturn;
}
void CGammaRamp::FreeLibrary()
{
//Free the GDI library.
if (hGDI32 != NULL)
{
::FreeLibrary(hGDI32);
hGDI32 = NULL;
}
}
BOOL CGammaRamp::LoadLibraryIfNeeded()
{
BOOL bReturn = FALSE;
if (hGDI32 == NULL)
LoadLibrary();
if (pGetDeviceGammaRamp != NULL && pSetDeviceGammaRamp != NULL)
bReturn = TRUE;
return bReturn;
}
BOOL CGammaRamp::SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp)
{
//Call to SetDeviceGammaRamp only if this function is successfully loaded.
if (LoadLibraryIfNeeded())
{
return pSetDeviceGammaRamp(hDC, lpRamp);
}
else
return FALSE;
}
BOOL CGammaRamp::GetDeviceGammaRamp(HDC hDC, LPVOID lpRamp)
{
//Call to GetDeviceGammaRamp only if this function is successfully loaded.
if (LoadLibraryIfNeeded())
{
return pGetDeviceGammaRamp(hDC, lpRamp);
}
else
return FALSE;
}
BOOL CGammaRamp::SetBrightness(HDC hDC, WORD wBrightness)
{
/*
Changes the brightness of the entire screen.
This function may not work properly in some video cards.
The wBrightness value should be a number between 0 and 255.
128 = Regular brightness
above 128 = brighter
below 128 = darker
If hDC is NULL, SetBrightness automatically load and release
the display device context for you.
*/
BOOL bReturn = FALSE;
HDC hGammaDC = hDC;
//Load the display device context of the entire screen if hDC is NULL.
if (hDC == NULL)
hGammaDC = GetDC(NULL);
if (hGammaDC != NULL)
{
//Generate the 256-colors array for the specified wBrightness value.
WORD GammaArray[3][256];
for (int iIndex = 0; iIndex < 256; iIndex++)
{
int iArrayValue = iIndex * (wBrightness + 128);
if (iArrayValue > 65535)
iArrayValue = 65535;
GammaArray[0][iIndex] =
GammaArray[1][iIndex] =
GammaArray[2][iIndex] = (WORD)iArrayValue;
}
//Set the GammaArray values into the display device context.
bReturn = SetDeviceGammaRamp(hGammaDC, GammaArray);
}
if (hDC == NULL)
ReleaseDC(NULL, hGammaDC);
return bReturn;
}
main.cpp
#include "brightness.h"
#include "gammaramp.h"
extern "C" __declspec(dllexport) char * GetPowerStatus()
{
SYSTEM_POWER_STATUS sps;
if (GetSystemPowerStatus(&sps))
{
switch (sps.ACLineStatus) // статус живлення
{
case 0:
return "Відключено";
case 1:
return "Підключено";
case 255:
default:
return "Невідомо";
break;
}
}
return "Unknown";
}
extern "C" __declspec(dllexport) char * GetBatteryFlag()
{
SYSTEM_POWER_STATUS sps;
GetSystemPowerStatus(&sps);
switch (sps.BatteryFlag) // статус заряда
{
case 1:
return "Високий";
case 2:
return "Низький";
case 4:
return "Критичний";
case 8:
return "Заряджається";
case 128:
return "Батарея відсутня";
case 255:
default:
return "Заряджається";
}
}
extern "C" __declspec(dllexport) int GetBatteryPercent()
{
SYSTEM_POWER_STATUS sps;
GetSystemPowerStatus(&sps);
return (int)sps.BatteryLifePercent;
}
extern "C" __declspec(dllexport) int GetBatteryTime()
{
SYSTEM_POWER_STATUS sps;
GetSystemPowerStatus(&sps);
return sps.BatteryLifeTime;
}
extern "C" __declspec(dllexport) int GetFullBatteryTime()
{
SYSTEM_POWER_STATUS sps;
GetSystemPowerStatus(&sps);
return sps.BatteryFullLifeTime;
}
extern "C" __declspec(dllexport) void SetBrightness(int Brightness)
{
CGammaRamp GammaRamp;
GammaRamp.SetBrightness(NULL, Brightness);
}
Інтерфейс
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Brightness
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms