Резидентная программа для Windows

Реферат

 

Пояснительная  записка  курсовой  работы  содержит  _16_  страниц,              _8_  рисунков,_4_ источника, _1_ приложение.

 

Ключевые  слова:  ПРОГРАММА,  РЕЗИДЕНТ, ТРЕЙ, СКРИНШОТ, ПУТЬ К ПАПКЕ, ТАЙМЕР 

 

 

       В данной курсовой работе рассмотрена программа-резидент, остающаяся в памяти после закрытия окна программы и обозначающая свое присутствие значком в трее.

       Цель  работы состоит в разработке программы-резидента, делающей снимок экрана с заданной периодичностью и сохраняющая файлы в выбранной папке. 
 
 
 
 
 
 
 
 
 
 
 
 
 

Оглавление

Введение 5

1. Постановка задачи и ее решение 6

1.1. Формулировка задачи 6

1.2 Спецификация задачи 6

2 Техническая реализация алгоритма решения 6

2.1 Выбор языка и среды программирования 6

2.2 Описание алгоритмов и программы 6

2.3 Описание методов программирования 8

3 Тестирование программы 11

Заключение 13

Список  литературы 14

Приложение  А. Листинг программы 15 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Введение

       Системное программное обеспечение — это комплекс программ, которые обеспечивают эффективное управление компонентами компьютерной системы, такими как процессор, оперативная память, устройства ввода-вывода, сетевое оборудование, выступая как «межслойный интерфейс», с одной стороны которого аппаратура, а с другой - приложения пользователя. В отличие от прикладного программного обеспечения, системное не решает конкретные прикладные задачи, а лишь обеспечивает работу других программ, управляет аппаратными ресурсами вычислительной системы и т.д.

       Резидентная программа (или TSR-программа, от англ. Terminate and Stay Resident — «завершиться и остаться резидентной») — в операционной системе MS-DOS программа, вернувшая управление оболочке операционной системы (command.com), либо надстройке над операционной системой (Norton Commander и т. п.), но оставшаяся в оперативной памяти персонального компьютера. Резидентная программа активизируется каждый раз при возникновении прерывания, вектор которого эта программа изменила на адрес одной из своих процедур.

       При работе с MS-DOS резидентные программы  широко использовались для достижения различных целей (например, русификаторы клавиатуры, программы доступа к локальной сети, менеджеры отложенной печати, вирусы).

       По  способу инициализации и вызова операционной системой резидентные  программы необходимо отличать от «настоящих» драйверов MS-DOS, встраиваемых операционной системой в своё ядро во время загрузки. В эпоху многозадачных ОС резидентными иногда называют программы, загруженные постоянно и работающие в фоновом режиме. 
 
 
 

  1. Постановка  задачи и ее решение
    1. Формулировка  задачи

       Разработать программу, работающую в фоновом  режиме. Программа должна оставаться в памяти после закрытия главного окна и обозначать свое присутствие  значком в системном трее. Также  программа должна с заданной периодичностью делать снимки экрана и сохранять  их в выбранную пользователем  папку.

    1.   Спецификация задачи

       Входные данные:

       - периодичность в секундах;

       - папка для сохранения скриншотов.

       Выходные  данные:

       -скриншоты

       - иконка с системном трее

  1. Техническая реализация алгоритма  решения
    1. Выбор языка и среды  программирования

         Языком  программирования  был  выбран  C#,  поскольку он  позволяет решать  широкий спектр  задач, легок в использовании,  обладает  гибкостью и большим количеством удобных в использовании библиотек. Помимо этого он позволяет использовать как объектно-ориентированный, так и структурный подход.

       В  качестве  среды  разработки  была  выбрана  IDE  Visual  Studio  2010 Express  Edition,  поскольку она обладает  удобным интерфейсом,  богатыми средствами  для отладки,  широко  распространена  и бесплатна для некоммерческого использования.

    1. Описание  алгоритмов и программы

       При запуске программы в системном  трее появляется значок. Таймер автоматически не запускается, программа находится в режиме ожидания. Контекстное меню открывается нажатием правой кнопкой мыши по иконке. Меню состоит из следующих пунктов:

  • «Настройка» - открывается главное окно программы, в котором можно задать интервал таймера, выбрать папку для сохранения скриншотов, свернуть окно и закрыть программу;
    • «Свернуть» - при выборе этого пункта меню сворачивается в трей главное окно программы;
    • «Запустить» - запускается таймер, с заданной периодичностью программа делает снимки экрана и сохраняет в выбранную папку. По умолчанию интервал таймера – 5 секунд, а папка сохранения – диск C. В режиме работы таймера нельзя изменить периодичность сохранения скриншотов.
    • «Остановить» - остановка таймера, режим ожидания. В этом режиме можно изменить интервал таймера.
    • «Выход» - полное закрытие программы
 

Рисунок 1- Диаграмма состояний и переходов  
 
 
 

    1. Описание  методов программирования

       Код формы, создание иконки в трее.

public Form1()

        {

            notifyIcon.Icon = new Icon(ICON_FILE_NAME);

            notifyIcon.ContextMenu = CreateMenu();

            notifyIcon.Visible = true;

            InitializeComponent();

        } 

       Код создания и настройки контекстного меню, запуск и остановка таймера.

ContextMenu CreateMenu()

        {

            ContextMenu menu = new ContextMenu(new MenuItem[]{

                new MenuItem(ITEM_SHOW_WINDOW),

                new MenuItem(ITEM_HIDE_WINDOW),

                new MenuItem(ITEM_ACTION),

                new MenuItem(ITEM_STOP),

                new MenuItem(ITEM_EXIT_APPLICATION)});

                menu.MenuItems[1].Enabled = false;

                menu.MenuItems[3].Enabled = false;

                foreach (MenuItem menuItem in menu.MenuItems)

                menuItem.Click += new EventHandler(OnMenuItemClick);

                return menu;

        }

        //Делаем доступным пункт Hide, а пункт Show - запрещаем

        protected override void OnLoad(EventArgs e)

        {

            notifyIcon.ContextMenu.MenuItems[0].Enabled = false;

            notifyIcon.ContextMenu.MenuItems[1].Enabled = true;

        } 

        //Делаем доступным пункт Show, а пункт Hide - запрещаем

        protected override void OnClosed(EventArgs e)

        {

            notifyIcon.ContextMenu.MenuItems[0].Enabled = true;

            notifyIcon.ContextMenu.MenuItems[1].Enabled = false;

        }

        //Анализируем какой MenuItem clik'нули и выполняем соответствующее действие

        void OnMenuItemClick(object sender, EventArgs e)

        {

            MenuItem menuItem = sender as MenuItem;

            switch (menuItem.Text)

            {

                case ITEM_SHOW_WINDOW:

                    ShowDialog();

                    break;

                case ITEM_HIDE_WINDOW:

                    Close();

                    break;

                case ITEM_STOP:

                    timer1.Enabled = false;

                    textBox1.Enabled = true;

                    notifyIcon.ContextMenu.MenuItems[2].Enabled = true;

                    notifyIcon.ContextMenu.MenuItems[3].Enabled = false;

                    break;

                case ITEM_ACTION:

                    inter = Convert.ToInt32(textBox1.Text) * 1000;

                    timer1.Interval = inter;

                    timer1.Enabled = true;

                    textBox1.Enabled = false;

                    notifyIcon.ContextMenu.MenuItems[3].Enabled = true;

                    notifyIcon.ContextMenu.MenuItems[2].Enabled = false;

                    break;

                case ITEM_EXIT_APPLICATION:

                    //Убираем иконку из system tray

                    notifyIcon.Visible = false;

                    //Завершаем приложения

                    Application.Exit();

                    break;

            }

        }

       Срабатывание  таймера, создание и сохранение скриншота.

        public string S = "";

        public int i = 0;

        public string Ss = ""; 

        private void timer1_Tick_1(object sender, EventArgs e)

        {

           

            Screen scr = Screen.PrimaryScreen;

            Image img = TakeScreenShot(scr);

            img.Save(@""+S+"\\screen" + i + ".jpg", ImageFormat.Jpeg);

            i++;

           

        }

       Функция создания скриншота

       Для хранения изображений в библиотеке GDI+ предназначен класс Image. Его потомки, классы Bitmap и Metafile, реализуют, соответственно, функциональность для работы с растровыми и векторными изображениями. Кстати, в документации .NET Framework SDK утверждается, что потомком Image является и класс Icon, но это не так: он унаследован  от System.MarshalByRefObject. В иерархии классов GDI+ для C++ класса Icon не существует (все необходимые средства для работы с иконками находятся в Bitmap).

       У класса Bitmap существует набор перегруженных  конструкторов для создания или  загрузки изображений. При загрузке содержимого файла анализируется  его формат (а вовсе не расширение!), и автоматически используется соответствующий  кодек. Определить, какой кодек (и  какой формат) был использован  при загрузке, можно с помощью  метода Image::GetRawFormat.

private Bitmap TakeScreenShot(Screen currentScreen)

        {

            Bitmap bmpScreenShot = new Bitmap(currentScreen.Bounds.Width,

                                              currentScreen.Bounds.Height,

                                              PixelFormat.Format32bppArgb); 

            Graphics gScreenShot = Graphics.FromImage(bmpScreenShot); 

            gScreenShot.CopyFromScreen(currentScreen.Bounds.X,

                                       currentScreen.Bounds.Y,

                                       0, 0,

                                       currentScreen.Bounds.Size,

                                       CopyPixelOperation.SourceCopy);

            return bmpScreenShot;

        }

       Функции кнопок на форме.

        private void button1_Click(object sender, EventArgs e)

        {Close();

        }       

        private void button2_Click(object sender, EventArgs e)

        {notifyIcon.Visible = false;

         Application.Exit();

        }

        private void button3_Click(object sender, EventArgs e)

        {if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

            {

           textBox2.Text = folderBrowserDialog1.SelectedPath;

            }

            S = textBox2.Text;

      }

    }

}

  1. Тестирование  программы

       Запуск  программы: в трее появился значок, главное окно скрыто.

       

       Рисунок 2 - Системный трей

       Открываем контекстное меню и разворачиваем  окно.

       

       Рисунок 3 - Контекстное меню

       

       Рисунок 4 - Окно программы

       Меняем  частоту и выбираем путь сохранения файлов.

       

       Рисунок 5 - Выбор папки для сохранения.

       

       Рисунок 6 - Изменение параметров программы 

       Запускаем таймер и через некоторое время  открываем выбранную папку:

Рисунок 7 - Папка со снимками экрана

Рисунок 8 - Папка со снимками экрана через некоторое время

       Останавливаем таймер и скриншоты перестают  сохраняться в папку.

       Программа работает нормально.

Заключение

       В ходе выполнения курсового проекта  была создана резидентная программа, создающая снимки экрана с заданной периодичностью и сохраняющая их в выбранную пользователем папку. При запуске программа создает  в системном трее значок и не показывает свое окно. Другими словами, программа  работает в фоновом режиме. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Список  литературы

  1. Системное программное обеспечение / А.В. Гордеев, А.Ю.Молчанов. – СПб.: Питер, 2001. – 736 с.: ил.
  2. Харт, Джонсон, М. Системное программирование в среде Win32, 2-е изд.: Пер. с англ.: – М.: Издательский дом «Вильямс», 2001.– 464 с.: ил. – Парал. тит. англ.
  3. У. Моррей, К. Паппас. Создание переносимых приложений для Windows/ Пер. С англ. — СПб.: BHV— Санкт-Петербург, 1997.— 816 с.: ил.
  4. Сайт http://msdn.microsoft.com

Приложение  А. Листинг программы

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;

using System.Drawing.Imaging; 

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        const string ICON_FILE_NAME = "ACDSee.ICO";

        const string ITEM_SHOW_WINDOW = "Show window";

        const string ITEM_HIDE_WINDOW = "Hide window";

        const string ITEM_EXIT_APPLICATION = "Exit";

        NotifyIcon notifyIcon = new NotifyIcon();

        public Form1()

        {

            notifyIcon.Icon = new Icon(ICON_FILE_NAME);

            notifyIcon.ContextMenu = CreateMenu();

            notifyIcon.Visible = true;

            InitializeComponent();

            int inter = Convert.ToInt32(textBox1.Text) * 1000;

Резидентная программа для Windows