Лекция № 5

Тема: «Обработка событий клавиатуры и мыши»

 

План

1. События мыши и их параметры

2. События клавиатуры

3. Функции для работы с клавиатурой

4. Коды клавиш

 

1. События мыши и их параметры

В компонентах C# определен ряд событий, связанных с мышью. Приведем основные из них:

 

Событие

Описание

Click

Щелчок мыши на компоненте и некоторые другие действия пользователя.

DoubleClick

Двойной щелчок мыши на компоненте.

MouseClick

Щелчок мыши на компоненте. В отличие от события Click позволяет распознать кнопку мыши, удерживаемый специальный символ, координаты курсора мыши при щелчке

MouseDoubleClick

Двойной щелчок мыши на компоненте. В отличие от события DoubleClick позволяет распознать кнопку мыши, удерживаемый специальный символ, координаты курсора мыши при щелчке

OnMouseDown

Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

MouseEnter

Указатель мыши входит в границы компонента

MouseHover

Указатель мыши некоторое время отсается неподвижным в пределах компонента

MouseLeave

Указатель мыши выходит за границы компонента

MouseMove

Перемещении курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

MouseUp

Отпускание прежде нажатой кнопки мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

MouseWheel

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

 

Событие MouseMove возникает при наведении мыши на компонент. Это событие можно использовать для создания "живого" интерфейса, когда компонент меняет свое оформление при наведении на него мышью.

Например. Пусть имеется поле textBox11. При наведении на него мышью фон поля меняется, а при наведении на форму – принимает исходный цвет.

В событии поляMouseMove напишем код:

 

private void textBox1_MouseMove(object sender, MouseEventArgs e)

{

    //устанавливаем цвет фона для поля

    textBox1.BackColor = Color.Yellow;

} 

 

В событии формы MouseMove напишем код:

 

 private void Form1_MouseMove(object sender, MouseEventArgs e)

{

    //возвращаем для поля цвет фона окна

    textBox1.BackColor = SystemColors.Window;

 

Это же событие можно использовать для информирования в строке статуса о назначении компонента, на который наведена мышь.

Например. Пусть имеется поле textBox1. При наведении на него мышью в строке статуса появляется текст "Текстовое поле", а при наведении на форму – текст исчезает.

 

В событии поля MouseMove напишем код:

  

private void textBox1_MouseMove(object sender, MouseEventArgs e)

{

    //отображаем текст в строке статуса

    toolStripStatusLabel1.Text = "Текстовое поле";

} 

В событии формы MouseMove напишем код:

 

 private void Form1_MouseMove(object sender, MouseEventArgs e)

{

    //удаляем текст в строке статуса

    toolStripStatusLabel1.Text = "";

 

В некоторых обработчиках событий мыши имеется специальный класс-параметр с именем "e", который в зависимости от события имеет дополнительные свойства, с помощью которых можно определить характеристики мыши и специальных клавиш прир наступлении событий.

К таким свойствам относятся:

- e.Button  определяет кнопку мыши и может принимать значение: MouseButtons.Left – левая кнопка; MouseButtons.Left – правая кнопка; MouseButtons.Left – средняя кнопка, MouseButtons.None - кнопка мыши не нажата.

- e.Clicks - возвращает число нажатий и отпусканий кнопки мыши;

- e.Delta - число со знаком делений, на которые было повернуто колесико мыши;

- e.X, e.Y – координаты курсора в клиентской области компонента. Благодаря этому можно обеспечить разную реакцию в зависимости от того, в какой части клиентской области расположен курсор.

Кроме этого в момент наступления события мыши пользователь может удерживать одну или нескольк специальных клавиш, распознать которые можно с помощью записи:

- (ModifierKeys & Keys.Control) ==Keys.Control нажата клавиша Ctrl

- (ModifierKeys & Keys.Alt) ==Keys.Alt нажата клавиша Alt

- (ModifierKeys & Keys.Shift) ==Keys.Shift нажата клавиша Shift

 

Пусть имеется список listBox1. Если щелкнуть на нем Alt+левая кнопка мыши, то список очищается, если щелкнуть Crtl+левая кнопка мыши, то список меняет цвет фона, если щелкнуть Alt+Shift+правая кнопка мыши, то список скрывается с формы.

 Обработчик можно написать в событии списка MouseDown или MouseUp.

 

 private void listBox1_MouseDown(object sender, MouseEventArgs e)

{

    //если нажаты Alt+левая кнопка мыши

    if ((ModifierKeys & Keys.Alt) == Keys.Alt && e.Button == MouseButtons.Left)

        listBox1.Items.Clear();

    //если нажаты Crtl+левая кнопка мыши

    else if ((ModifierKeys & Keys.Control) == Keys.Control && e.Button == MouseButtons.Left)

        listBox1.BackColor = Color.Yellow;

    //если нажатые Alt+Shift+левая кнопка мыши

    else if ((ModifierKeys & Keys.Alt) == Keys.Alt && (ModifierKeys & Keys.Shift) == Keys.Shift && e.Button == MouseButtons.Right)

        listBox1.Visible = false;

} 

 

Большинство оконных компонентов – многострочные окна редактирования, списки и т.п. имеют обработчики вращений колесика мыши по умолчанию. Это относится к Memo, RichEdit, ListBox и многим другим, в том числе и к формам. Правда, в некоторых из них, например, в Memo, эти обработчики по умолчанию будут срабатывать только в том случае, если в компоненте заданно отображение полос прокрутки (то есть это обработчики не самых элементов, а полос прокрутки).

Обработчики по умолчанию обеспечивают при вращении колесика сдвиг содержимого в соответствующем направлении. Так что писать обработчики событий, связанных с колесиком, имеет смысл только в случаях, когда надо обеспечить нестандартную реакцию компонента. Например: с помощью колесика мыши обеспечить уменьшении формы при вращении колесика вниз, и увеличении формы при вращении колесика вверх.

 Так как событие MouseWheel отсутствует в окне свойст компонентов, то ввести код обработчика нужно будет вручную.

 

private void Form1_MouseWheel(object sender, MouseEventArgs e)

{

    //если колесико смещается  на положительное значение (вверх)

    if (e.Delta>0)

        //увеличиваем ширину и высоту формы на 10px

        {Width=Width+10; Height=Height+10;}

    //иначе

    else

        //уменьшаем ширину и высоту формы на 10px

        {Width=Width-10; Height=Height-10;}

}

 

Так как обрабочик MouseWheel был создан вручную, то наш проект "ничего не знает" о нем. И заголовок обработчика будет подчеркиваться как ошибка. Необходимо зарегистрировать созданный метод как обработчик события формы. Для этого в коде формы найдите конструктор и после команды InitializeComponent(); введите строку регистрации созданного метода как обработчика нужного события:

 

 this.MouseWheel += new MouseEventHandler(this.Form1_MouseWheel);

 

- this.MouseWheel - название события формы. Ключевое слово this указывает на форму. Вместот него можно указать имя любого компонента для регистрации события для нужного компонента. Например, textBox1.MouseWheel

- new MouseEventHandler - указывает, что мы создаем новый обработчик мыши;

- this.Form1_MouseWheel - имя метода, который будет вызываться при наступлении события. Созданный нами выше метод имеет имя Form1_MouseWheel. Сам метод является частью класса текущей формы, к которой можно обратиться по ключевому слову this.

 

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

 

Перетаскивание  формы

В некототрых программах формы могут иметь нестандартный вид, в том числе без строки загловка окна. В этом случае возникает проблема с претаскиванием таких окон по экрану. В качетве принятого стандарта такие окна перетаскиваются за любое пустое место на них. Для организации такого перетаскивания окон необходимо использовать специальные WinAPI функции операционной системы Windows. Такие функции находятся в отдельных *.dll файлах и для использования таких функций необходимо их подключать к проекту специальными командами.

В данном случае нам нужны функции ReleaseCapture и SendMessage. Данные функции описаны в файле user32.dll Перед их использованием необходимо выполнить ряд действий:

 

- подключить пространство имен using System.Runtime.InteropServices

- вверху класса формы указать код подключения данных функций:

 

//указываем в каком *.dll файле находится функция

[DllImportAttribute ("user32.dll")]

//подключаем ее, указывая ее полный заголовок со списком параметров

public static extern bool ReleaseCapture();

 

//аналогично подключаем вторую функцию

[DllImportAttribute("user32.dll")]

public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int LPAR);

 

Код перетаскивания нужно писать в событии MouseDown формы.

 

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

    //делаем форму полупрозрачной (необязательно)

    Opacity = 0.5;

    //перетаскиваем форму по экрану

    ReleaseCapture();

    SendMessage(Handle, 0xa1, 0x2, 0);

    //после отпускания кнопки мыши восстанавливаем прозрачность

    Opacity = 1;

}

 

2. События клавиатуры

В компонентах Delphi определено три события, связанных с клавиатурой. Это события:

Событие

Описание

KeyDown

Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ нажатой клавиши.

KeyPress

Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши.

KeyUp

Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ клавиши, которая отпускается.

 

По умолчанию форма не реагирует на нажатие клавиш. Даже, если написать обработчики для нужных событий, то они не будут работать, пока не установить для формы свойство KeyPreview=true.

События OnKeyUp и OnKeyDown имеют одинаковый параметр "e", с помощью которого можно получить доступ к свойствам, позволяющим узнать какая клавиша была нажата или отпущена, а аткже какая специальная клавиша могла быть нажата. К таким свойствам относят:

- e.KeyCode - код нажатой клавиши. Код клавиши - это не код введенного символа. Так, с помощью одной клавиши можно ввести до 4 разных символов (например, S, s, Ы, ы), но данной событие не различает вводимые символы, и независимо от языка и регистра, каждая клавиша всегда имеет одинаковый код. Для получения кода клавиш используют встроенный тип Keys, который содержит все нужные коды. Достаточно ввести слово Keys, поставить точку и из выпадающего списка выбрать название нужной клавиши. Обращаю внимание, что числовые клавиши от 0 до 9 имеют имена Keys.D0 - Keys.D9. Это связано с тем, что имя не может начинаться с цифры, поэтому добавили букву D (digit - цифра).

- e.Control - возвращает true, если в момоент нажатия клавиши удерживалась специальная клавиша Ctrl.

- e.Alt - возвращает true, если в момоент нажатия клавиши удерживалась специальная клавиша Alt.

- e.Shift - возвращает true, если в момоент нажатия клавиши удерживалась специальная клавиша Shift.

 

Cобытия KeyDown или KeyUpможно использовать для присваивания «горячих» клавиша для доступа к элементам на форме. В этом случае обработчик события должен создаваться для всей формы. Это позволит форме реагировать на нажатия любых сочетаний клавиш независимо от того, на каком компоненте формы находится фокус (курсор).

 

Пример. Пусть на форме есть два переключателя (radioButton1 и radioButton2). Написать код, который переключает эти элементы с помощью комбинаций Alt+F1 и Alt+F2.

Для формы включите свойство KeyPreview. В событии формы KeyDown напишем код:

 

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

    //если нажато сочетание Alt+F1   

    if (e.Alt && e.KeyCode == Keys.F1)

        radioButton1.Checked = true;

    //если нажато сочетание Alt+F2    

    else if (e.Alt && e.KeyCode == Keys.F2)

        radioButton2.Checked = true;

} 

 

Пример. Пусть на форме имеется фляжок checkBox1. Написать код, который переключает флажок с помощью комбинации Ctrl+1.

Для формы включите свойство KeyPreview. В событии формы KeyDown напишем код:

 

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

    //если нажато сочетание Ctrl+1   

    if (e.Control && e.KeyCode == Keys.D1)

        checkBox1.Checked = !checkBox1.Checked;

} 

Событие KeyPress

Теперь перейдем к рассмотрению события KeyPress. В этот обработчик, как и в описанные выше, передается параметр "e", которрый имеет свойство KeyChar. Это уже не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква, или строчная, русская, или латинская.

Пусть, например, вы задали пользователю вопроса, на который он должен ответить символами "Д" или "д" (да), или символами "Н" или "н" (нет). Тогда распознать утвердительный ответ в обработчике события OnKeyPress можно оператором:

 

if (e.KeyChar=='Д' || e.KeyChar=='д')  . . .

. . .

else if (e.KeyChar=='Н' || e.KeyChar=='н') . . .

. . . ;

 

Если программа может распознать нажатый символ, то можно создавать код, который будет фильтровать вводимую информацию, защищая программу от ошибок ввода.

Пример. Пусть имеется текстовое поле textBox1. Необходимо, чтобы в поле можно было ввести только русские буквы, пробел и тире.

Для наложения такого ограничения нужно в событии OnKeyPress поля ввести код:

 

void textBox1_KeyPress(object sender, KeyPressEventArgs e)

{

    //если введенный символ не русская буква (А..я), не пробел и не тире

    if ((e.KeyChar <'А' || e.KeyChar >'я') && e.KeyChar !=' ' && e.KeyChar!='-')

    {

        //то символ заменяется на нулевой

        e.KeyChar='\0';

        //издаем гудок на динамике

        Console.Beep();

    }

}

 

Если введенный символ не русская буква, не пробел и не тире, то этот символ заменяется на пустой и не отображается в поле.

Пример. Пусть в поле textBox1 нужно разрешить вводить буквы на двух алфавитах. Диапазон запрещенных символов нужно изменить

 

void textBox1_KeyPress(object sender, KeyPressEventArgs e)

{

    if ((e.KeyChar <'A' || e.KeyChar >'z') && (e.KeyChar <'А' || e.KeyChar >'я') && e.KeyChar !=' ' && e.KeyChar!='-')

    {

        //то символ заменяется на нулевой

        e.KeyChar='\0';

        //издаем гудок на динамике

        Console.Beep();

    }

}

 

Пример. Если в поле нужно ограничить ввод только цифрами, десятичной точкой, и знаком числа "-", то код может иметь вид:

 

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

{

    //если пользователь ввел точку или запятую в числе, то

    //надо заменить ее на символ десятичной точки,

    //принятый в настройках операционной системы пользователя

    //например, русская Windows в качестве точки использую запятую

    //английская Windows в качестве точки использует точку

 

    // для этого опишем переменную и сохраним в нее символ разделителя, принятый в ОС пользователя

    char ch = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];

    //если пользователь ввел точку или запятую в числе

    if (e.KeyChar=='.' || e.KeyChar==',')

    //заменяем ее на соответствующий символ десятичной точки из операционной системы

    e.KeyChar=ch;

 

    //если введена не цифра (0..9), не Backspace (8), не десятичная точка, или не минус

    if ((e.KeyChar <'0' || e.KeyChar >'9') && e.KeyChar !=8 && e.KeyChar !=ch && e.KeyChar !='-'

    //или, если введена десятичная точка, но она уже есть (IndexOf(ch)!=-1)

    || (e.KeyChar == ch && (sender as TextBox).Text.IndexOf(ch)!=-1)

    //или, если введен минус, но он уже есть (IndexOf('-')!=-1)

    || (e.KeyChar == '-' && (sender as TextBox).Text.IndexOf('-')!=-1)

    //или, если введен минус, но он не первый в поле (SelectionStart>0)

    || (e.KeyChar == '-' && (sender as TextBox).SelectionStart>0))

    {

        //то введенный символ игнорируется

        e.KeyChar='\0';
             //издаем гудок на динамике

       Console.Beep();

    }


    } 

В этом примере используется метод текстового поля (sender as TextBox).Text.IndexOf(фрагмент). Данный метод ищет фрагмент внутри свойства Text поля. Если фрагмент найден, то метод возвращает номер позиции (нумерация с 0), с которой тначинается фрагмент в тексте. Если фрагмент не найден, то метод возвращает -1.

Например:

 

textBox1.Text="информатика";

textBox1.Text.IndexOf("форма") = 2

textBox1.Text.IndexOf("пример") = -1

 

В последнем условии используется свойство текстового поля SelectionStart, в котором хранится положения курсора в поле (нумерация с 0). Поэтому, если SelectionStart не 0, то это означает, что мы вводим символ "-" не в первой позиции, что недопустимо для числа.

 

3.Функции для работы с клавиатурой

Изменение языка при входе в поле

Для облегчения работы пользователя с программой можно предусмотреть автоматическое переключение языка клавиатуры при входе в поле или при запуске программы. В первом случае код нужно писать для события Enter текстового поля. Это событие наступает при получении полем фокуса. Во второму случае код нужно писать в событии Load нужной формы. Сам код имеет вид (пример для события Enter):

 

void textBox1_Enter(object sender, EventArgs e)

{

    //включаем английский язык   

    InputLanguage.CurrentInputLanguage =  

    InputLanguage.FromCulture(new System.Globalization.CultureInfo("en-US"));

}

 

Для переключения на другие языки нужно в команде указать соответствующий код языка:

"ru-RU" – русский язык;

"uk-UA" – украинский язык;

 "fr-FR"– французский язык;

"de-DE" – немецкий язык.

 

Распознавание состояния специальных клавиш

Стандартные события клавиатуры KeyDown, KeyUp и KeyPress имеют ограничения на распознавание нажатия клавиш. Например, они не могут распознать включения или отключения клавиш CapsLock, NumLock, Insert, ScrollLock.

Для выполнения такого распознавания используеттся специальный логический метод встроенного класса C#

 

Control.IsKeyLocked(код клавиши)

 

Если метод вернул true, то клавиша включена, если false, то выключена. Обьратите особое внимание, что для корректной работы этого кода его нужно всегда писать в событии формы KeyUp.

 

Пример. Пусть имеется строка статуса, которая состоит из 4 панелей. Нужно при каждом нажатии на клавишу CapsLock отображать в четвертой панели состояние этой клавиши: текст «CAPS» – если клавиши включена и пустой символ – если выключена. В событии формы OnKeyUp напишем код:

 

private void Form1_KeyUp(object sender, KeyEventArgs e)

{

    //если CapsLock включена

    if (Control.IsKeyLocked(Keys.Capital))

        //в 4 панели строки статуса отображаем текст CAPS

        toolStripStatusLabel4.Text = "CAPS";

    //иначе, если CapsLock выключена

    else

        //в 4 панели строки статуса удаляем текст

        toolStripStatusLabel4.Text = "";

Программное нажатие на клавише

Существует возможность программно эмулировать нажатие клавиш на клавиатуре. При этом компьютер обработает данное нажатие так же, как если бы клавишу нажал пользователь. Для реализации такой возможности используют специальную WinAPI функцию keybd_event.Для работы с этой функцией вверху кода класса формы подключите эту функцию из *.dll файла с помощью команды:

 

[DllImport("user32.dll")]

public static extern void keybd_event(Keys bVk, byte bScan, UInt32 dwFlags, IntPtr dwExtraInfo);

 

Для программного нажатия на нужную клавишу всегда используют пару таких команд. Первая нажимает, вторая отпускает.

 

//нажимаем клавишу

keybd_event(код_клавиши, 0x45, 0, IntPtr.Zero );

//отпускаем клавишу

keybd_event(код_клавиши, 0x45, 2, IntPtr.Zero);

 

Пусть при открытии формы нужно включить клавишу NumLock, если она была выключена. Для этого в событии формы Load напишем код:

 

void Form1_Load(object sender, EventArgs e)

{

    //если клавиша NumLock выключена

    if (!Control.IsKeyLocked(Keys.NumLock))

    {

        //нажимаем клавишу

        keybd_event(Keys.NumLock, 0x45, 0, IntPtr.Zero );

        //отпускаем клавишу

        keybd_event(Keys.NumLock, 0x45, 2, IntPtr.Zero);

    }

 }

 

Распознавание левой и правой специальной клавиши

WinAPI функция GetAsyncKeyState позволяет также распознать, какую именно из двух специальных клавиш нажал пользователь: левую или правую.

Для работы с этой функцией вверху кода класса формы подключите эту функцию из *.dll файла с помощью команды:

 

 [DllImport("user32.dll")]

public static extern short GetAsyncKeyState(Keys vKey);

 

 

Для определения, нажата ли левая или правая клавиша, используют команду:

 

if GetAsyncKeyState(код клавиши)!=0

    //клавиша нажата

 

Обратите внимание, что в качестве имен клавиш нужно использовать специальные, обозначающие левую или правую версию.

- Keys.LMenu, Keys.RMenu - левый и правый Alt

- Keys.LControlKey, Keys.RControlKey - левый и правый Ctrl

- Keys.LShiftKey, Keys.RShiftKey - левый и правый Shift

 

Пример. Пусть имеется два переключателя radioButton1 и radioButton2. Первый из них нужно включать комбинацией левый Alt+1, а второй – правый Alt+1. Для этого в событии формы KeyDown напишем код:

 

void Form1_KeyDown(object sender, KeyEventArgs e)

{

    //если нажаты клавиши левый Alt + 1

    if (GetAsyncKeyState(Keys.LMenu)!=0 && e.KeyCode == Keys.D1)

        //включаем первый переключатель

        radioButton1.Checked = true;

    //иначе, если нажаты клавиши правый Alt + 2

    else if (GetAsyncKeyState(Keys.RMenu)!=0 && e.KeyCode == Keys.D2)

        //включаем второй переключатель

        radioButton2.Checked = true;

}

 

4. Создание файла класса с WinAPI функциями

В рассмотренных ранее примерах мы использовали 4 WinAPI функции для работы с мышью и клавиатурой. Напоминаю, что для работы с ними, их нужно подключать (импортировать) из *.dll файла. Сами команды импорта длинные и запомнить их очень сложно. Если поддержку работы с мышью или клавиатурой приходжиться реализовывать в разных проектах, то команды подключения WinAPI функций необходимо будет писать заново, что не совсем удобно.

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

Опишем процедуру создания файла класса.

 

В окне "Обозреватель решений"вызовите контекстное меню проекта и выберите команду "Добавить - Класс", укажите имя класса (например WinAPI) и щелкните кнопку Добавить. В результате в структуре вашего проекта должен появиться новый файл класса WinAPI.cs Откройте файл класса и введите в него команды импорта нужных WinAPI функций. Для нашей лекции такие команды могут иметь вид:

 

[DllImportAttribute("user32.dll")]

public static extern bool ReleaseCapture();

 

[DllImportAttribute("user32.dll")]

public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int LPAR);
 

[DllImport("user32.dll")]

public static extern short GetAsyncKeyState(Keys vKey);

 

[DllImport("user32.dll")]

public static extern void keybd_event(Keys bVk, byte bScan, UInt32 dwFlags, IntPtr dwExtraInfo); 

 

После этого в коде для вызова WinAPI функции вы будете указывать ее обязательно с именем класса. Например, запишем предыдущий пример с учетом того, что импорт WinAPI функций вынесен в отдельный файл класса WinAPI.cs

 

void Form1_KeyDown(object sender, KeyEventArgs e)

{

    //если нажаты клавиши левый Alt + 1

    if (WinAPI.GetAsyncKeyState(Keys.LMenu)!=0 && e.KeyCode == Keys.D1)

        //включаем первый переключатель

        radioButton1.Checked = true;

    //иначе, если нажаты клавиши правый Alt + 2

    else if (WinAPI.GetAsyncKeyState(Keys.RMenu)!=0 && e.KeyCode == Keys.D2)

        //включаем второй переключатель

        radioButton2.Checked = true;

}

 

Для использования созданного файла класса в другом проекте в окне "Обозреватель решений" вызовите контекстное меню проекта и выберите команду "Добавить - Существующий элемент"и укажите файл вашего класса. В результате в структуре нового проекта должен появиться файл класса WinAPI.cs  Откройте файл класса и убедитесь, что его название пространства имен namespace ... совпадает с названием пространства имен класса формы namespace ... Если это не так, то поменяйте в файле добавленного класса название пространства имен на нужное.После этого в коде нового проекта можете использовать нужные функции с указанием имени класса.

 

Вопросы для самоконтроля

 

1. Какие события мыши вы знаете?

2. Какие параметры имеют события мыши? Дайте их характеристику.

3. Как организовать обработку события от вращения колесика мыши? Пример изменения размера формы.

4. Как выполнить перетаскивание формы по экрану за свободное место на ней?

5. Дайте характеристику событиям KeyDown, KeyUp. Какие  параметры имеют эти события?

6. Дайте характеристику события KeyPress. Какой параметр оно имеет?

7. Приведите код ограничения поля на ввода только целых чисел.

8. Приведите команду переключения языков на клавиатуре.

9. Как определить состояние специальных клавиш NumLock, CapsLock, Insert.

10. Приведите команды программного нажатия на клавишу.

11. Как распознать нажатие левой или правой специальной клавиши?