Програмуємо під Windows Mobile 6

проект

Добрі дядькиAppleзвикли вирішувати за користувача, яке ПЗ і які опції йому потрібні. Це вибір їх користувачів. Ми ж з тобою беремо і просто самі кодимо те, що нам потрібно. Стара добра Вінда була і залишається другом користувачів і програмістів, які обирають свій шлях.

WinMobile сьогодні

Ще буквально кілька років тому мобільна платформа страждала на дефіцит програмного забезпечення. Важко повірити, але щоб знайти потрібну тулзу, доводилося нехило попітніти. А потім ще раз напружитись у спробах відшукати заповітний крек (Дивно, а начебто все непогано перебувало, - Прим. Dr.Klouniz). Відсутність софту обумовлювалося тим, що з розробки програм під нову платформу був зручної IDE. Так, був могутній Visual C++, у якому, якщо мені змінює пам'ять, були відповідні майстри. Але, на жаль, їх можливостей не вистачало. Коли в 2003 році я спробував зробити першу програму для КПК, то відразу зрозумів, що моїх нервів не вистачить для інтимних відносин з жахливою Visual Studio. ПісляDelphiце середовище здається аж надто непродуманим і незрозумілим. Таке почуття, що пересідаєш із «мерса» на «Волгу».

WinMobile сьогодні

Дорожня валізка

Час гроші

Вважатимемо, що ти успішно скачав і встановив потрібний SDK, а це означає, що можна рухатися далі. Запускай VisualStudio і створюй новий проект для Visual C# типуSmart Device. Відразу після вибору типу проекту перед тобою має з'явитися вікно.

Увага! Якщо на твоєму пристрої досі встановлено першу версію .NET Framework, то бігом на microsoft.com і завантажуй хоча б другу. Перша надто вже сильно урізана в плані функціоналу. Все, тепер залишається тільки вибрати шаблон для нашої програми. ДляСьогоднішніх прикладів нам цілком підійде Device Application. Клацай Ок - і VisualStudio згенерує новий порожній проект.

За замовчуванням VS створює чистий проект для мобільних пристроїв зі скіном у вигляді цього девайса. Правду кажучи, «дизайнить» форму в такому вигляді не дуже зручно, тому попрацюй відразу відключити відображення скіна. Зробити це можна, клацнувши правою клавішею миші за формою та вибравши в контекстному меню «Show Skin». Після цієї нехитрої дії ти побачиш більш-менш звичний вигляд форми.

Порожній проект готовий і настав час привести його до робочого вигляду. Готуй мишку, зараз ми розкидатимемо елементи управління. Сьогодні ми розберемо не один, а одразу кілька прикладів. Для такого проекту потрібна відповідна форма. До речі, варіанти форми з купою закладок я собі не знайшов. Тому раджу тобі не морочитися і піти тим же шляхом, що і я – кинути та розтягнути по всій формі компонент TabControl, а потім створити в ньому п'ять закладок:

  • Надсилання SMS;
  • процеси;
  • Файловий менеджер;
  • Dialer;
  • Корисність.
  • Думаю, призначення закладок не треба пояснювати. Все й так очевидно за їхніми назвами. Що? Тобі цікаво, що це за закладка «Корисності»? OK, зараз поясню. Тут розташовано кілька кнопок, які виконують деякі корисні для користувача або західнобудівника дії: поворот екрану, вимкнення/перезавантаження системи.

    Напишіть листа…

    З дизайном форми покінчено, настав час переходити до кодингу. Перше, чого ми сьогодні навчимося – надсилати SMS. Цими короткими повідомленнями користується кожен із нас, а якщо так, непогано б навчитися відправляти їх програмно. Навіщо? Цілі можуть бути різними. Наприклад, деякі на основі здобутих знань зможутьзакодувати простеньку програму, яка транслітеруватиме весь кириличний текст, тим самим, дозволяючи заощадити свої кревні на відправці SMS. Інші можуть через SMS виводити з ворожої території різну корисну інформацію. Отже, створи обробник події для однієї єдиної кнопки з написом «надіслати» і напиши в ньому наступний код:

    Кода небагато, тож швиденько переписуй і повертайся сюди за роз'ясненнями. У першому рядку я перевіряю, чи заповнено поле з одержувачем (якщо ні, то робити нічого не потрібно). Врахуй, що для демонстраційного прикладу такої перевірки цілком достатньо, але для створення реального застосування її буде замало. Якщо ти вирішиш у майбутньому закодувати тулзу для надсилання повідомлень, я рекомендую тобі перевіряти номер одержувача за допомогою регулярних виразів. Тільки так можна бути впевненим, що це справді номер, а не чехарда з літер та цифр. Перевіривши номер одержувача можна переходити безпосередньо до відправки. Для відправки SMS до SDK є готовий клас -SmsMessage. Як і належить, перед тим як почати працювати з класом, потрібно створити його екземпляр. Саме це я і роблю в другому рядку коду. Ініціалізувавши клас, потрібно не губитися, а одразу почати заповнювати його властивості. На щастя, їх небагато:

  • TO– колекція отримувачів. У цій властивості ти можеш встановити як одного, так і кількох отримувачів.
  • RequestDeliveryReport– звіт про доставку. Якщо в цій властивості true, після відправлення повідомлення буде запитано звіт.
  • Body– текст повідомлення.
  • Розібравшись із властивостями, можна переходити до методів, а методів лише один –Send(). У прикладі виклик методу Send() я укладаю блок операторів виняткових ситуацій. Це робиться на випадокнесподіваних помилок. Спробуй зараз зберегти внесені зміни та зібрати проект. Не поспішай панікувати, якщо VS нервово матюкається. Просто додай новий простір імен (Microsoft.WindowsMobile.PocketOutlook) - і знову спробуй зібрати проект. Що не хоче? Ok, don’t worry. Зайди в менюProject -> Add Reference. У вікні вибери потрібну збірку і натисніть «ОК». Тепер проект має успішно зібратися. Можеш вже зараз залити свіжоспечену прогу в свій девайс і протестувати. А я почну розбирати наступний приклад.

    Моніторимо процеси

    Код самої процедури ти можеш знайти на відповідному врізанні. Починай його переписувати, а я спробую пояснити, що в ньому відбувається.

    Поглянувши на лістинг, ти напевно здивувався – для отримання списку процесів знадобився лише один рядок (перебір і додавання кожного з них у ListView не рахуємо). Якщо ти хоч раз пробував кодувати «диспетчер процесів» під Win32 (звичайно кодив; ][акер вже не раз писав про це), то напевно пам'ятаєш, що для отримання списку активних процесів доводилося викликати купу API-функцій і робити багато рухів тіла, - а тут все якось легко і швидко. Але не так просто, як здається на перший погляд!

    Рядок «process_list = TaskManager.Process.GetProcesses()» говорить про те, що одержання процесів відбувається за допомогою виклику методу GetProcess() класу Process. Клас Process є розробкою Cristian Forsberg і завдяки йому робота з процесами перетворюється на суцільне задоволення. Точніше, в один рядок. Все, що нам потрібно, - це отримати список всіх процесів за допомогою виклику всього лише одного методу - GetProcess() . Після цього залишається лише запустити перебір у циклі та витягнути інформацію про кожного з них. Всю цю інформацію (кількістьпотоків, ім'я процесу, pid) я і додаю до ListView. Решту чорної роботи робить добре продуманий клас. До речі, модуль із класом ти можеш взяти з нашого диска, а після виходу журналу у світ та на www.vr-online.ru буде доступний трохи перероблений варіант цього класу, з можливістю отримувати шлях до файлу процесу. Вважатимемо, що список процесів у нас отримано. Тепер треба навчитися ним керувати – вбивати зайві. Для вирішення цього нескладного завдання у класу Process є спосіб Kill(). Реалізація процесу завершення – нижче:

    Силами цього нехитрого коду я виколупую виділений процес і просто викликаю вищеозвучений метод. Просто до неподобства!

    Файловий менеджер

    Файловий менеджер – тулза, без якої я не можу уявити жодного робочого дня. На «великому» комп'ютері я зручно користуюся безкоштовним UnrealCommander (майже клон TotalCommander'a). З недавнього часу необхідність у функціональному файловому менеджері виникла і під час роботи на комунікаторі. Знову ж таки, я не став морочитися з Resco Explorer і його маленькими друзями, а вирішив спробувати закодувати все самостійно. Створи порожню функціюFileListі наповни її тіло (Хе-хе, – прим. Dr.Klouniz) кодом з відповідної врізки. Як завжди, повертайся за роз'ясненнями.

    На самому початку я змінюю вигляд курсору. Отримання списку файлів – справа нешвидка, особливо на мобільних девайсах. Тому, щоб зайвий раз не бентежити користувача, краще вибрати звичний курсор для гальмівних операцій та спати спокійно. Після такої хитрої підготовки (нервової системи користувача) ніщо не завадить перейти безпосередньо до отримання списку файлів. Спочатку отримаємо список директорій (нехай вони будуть зверху, як і заведено у всіх файлових менеджерах), а вже після цього пробіжимосяза файлами. Для отримання директорій використовую клас Directory. Цей клас має методGetDirectories(),що дозволяє отримати список папок за переданим як єдиний параметр шляху. Отримавши список папок, їх обов'язково потрібно додати в контейнер-колекцію, щоб потім можна було зручно відсортувати (foldersList.Sort();).

    Копіювання файлу реалізується аналогічним способом, але з однією відмінністю – тут потрібно викликати не метод Delete(), а метод Copy(), якому потрібно передати два параметри:

  • Повний шлях до файлу джерела;
  • Повний шлях до файлу приймача.
  • Визначити файл-джерело можна таким же способом, як і при видаленні, тому ще раз наводити код я не буду. Папки створюються за допомогою методуCreateDirectory(). Метод приймає лише один параметр – шлях до створюваної папки. Як бачиш, вбудовані класи значно спрощують роботу з файлами і папками, дозволяючи зовсім забути про незручне використання Windows API. Зовсім інша історія із запуском файлів.

    Так вийшло, але розробники C# не забезпечили нас зручним класом для запуску зовнішніх програм. Сумно, але не смертельно. Вже відомий нам Cristian Forsberg, окрім класу для роботи з процесами, люб'язно надав на суд громадськості клас ShellExecute, що дозволяє стартувати програми. Підключи модуль з класом до свого проекту і, викликавши метод Start(), передай йому шлях до файлу, що запускається. Подальше – робота класу. Я не наводитиму приклад коду запуску, тому що в ньому нічого немає складного. У крайньому випадку, на DVD на тебе чекає повний вихідник з усіма розглянутими класами.

    Подзвони мені подзвони

    Цих трьох рядків достатньо, щоб здійснити дзвінок за номером (звісно, ​​платним! :)),введеному у поле tbTellNumber. Другий параметр (false) методу Talk говорить про те, що номер потрібно набирати одразу ж, не чекаючи дозволів.