Практикум 1. Пишем программу для отдыха глаз


Эта практическая работа будет достаточно простой. Суть задачи состоит в следующем:

Написать программу тренировки глаз.

Не смотря на тривиальность подобной задачи, в голову пришла именно она, потому как программисту приходится практически неотрывно сидеть за монитором по 10-11 часов рабочего времени и глаза от этого просто садятся.

Эта практическая работа будет построена по схеме 30/70. 30% даю я, остальное пишете уже вы.

Так как многие заходят на programbeginner.ru изучать уроки C#, программа будет написана на нем. Кроме того, суть ее заключается в том, что нужно будет постоянно эту программу дописывать и улучшать.

В рамках этого занятия напишем утилиту, которая через час работы за компьютером тушит монитор на 15 минут и сделаем заготовку программы для тренировки глаз.

Так как именно эта часть программки очень простая, то для ее написания подойдет легковесная SharpDevelop. Но вы можете писать на чем угодно.

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

Итак, для начала нужно создать новое решение и выбрать в нем Windows Application. Упростим немного задачу и сделаем выключение монитора по кнопке на форме. Например, в этом примере кнопка может выглядеть так:

Не стоит обращать внимание на внешний вид – это просто отладочная форма. В дальнейшем в развитии этой программы она не будет нужна.

Код достаточно простой, но есть моменты, на которые нужно обратить внимание. Так как мы импортируем dll, то нужно указать C#  использовать System.Runtime.InteropServices:


using System.Runtime.InteropServices;

Без этого программа не скомпилируется.

Теперь импортируем библиотеку user32.dll с необходимыми константами:


[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern void mouse_event(IntPtr dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);

private const int MOVE = 0x0001;
private const int HWND_BROADCAST = 0xffff;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;

В принципе, теперь можно и тушить монитор. Делается это отправкой сообщения Windows SendMessage.


SendMessage((IntPtr)HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

Обратите внимание, что я уже сделал небольшую подсказку для решения задачи автоматического включения монитора. Но это уже на домашнее задание.

Весь код выключения монитора вышел таким:


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Выключение_монитора
{
public partial class MainForm : Form
{

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern void mouse_event(IntPtr dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);

private const int MOVE = 0x0001;
private const int HWND_BROADCAST = 0xffff;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
public MainForm()
{        }
void Button1Click(object sender, EventArgs e)
{
SendMessage((IntPtr)HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

}
}
}

Скомпилируйте его в релизную версию и попробуйте работу.

Домашнее задание:

Эта программа не отвечает поставленной задаче. Фактически, экран выключается по кнопке. А должна через час выключать монитор сама и, в идеале, должна пробудить его через пять минут, игнорируя нажатия клавиш и мышки. Постарайтесь сами решить эту задачу.

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

Яндекс.Метрика