Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 800564

.pdf
Скачиваний:
3
Добавлен:
01.05.2022
Размер:
5.57 Mб
Скачать

using System.Runtime.InteropServices; using System.IO;

Выполнение задания 1:

Реализация программы с помощью функции API на языке программирования Object Pascal.

1) Для примера составим функцию CapsLock, которая позволит определить включена или выключена клавиша CapsLock. В Windows определены специальные константы для каждой клавиши. VK_CAPITAL – константа кода виртуальной клавиши CapsLock.

function CapsLock : boolean; begin

result:=(GetKeyState(VK_CAPITAL) and 1) <> 0; end;

2)Поместить на форму объект Button и подписать выполняемое действие щелчком по данной кнопке (свойство Caption). Добавить объект Edit или Label, в котором будет появляться сообщение о состоянии клавиши CapsLock.

3)В событие OnClick объекта Button ввести следующие операторы:

a:=CapsLock; if a=TRUE then

EditCL.Text:= 'нажата клавиша CapsLock ' else

EditCL.Text:=' клавиша CapsLock не нажата ';

4)Запустить программу на выполнение.

5)Самостоятельно составить функции и процедурыловушки нажатия на клавиши пользователями (не менее 5). Таблица кодов виртуальных клавиш представлена в таблице 8.

6)Составить аналогичную программу на языке C# с помощью функций API.

171

Листинг программы на языке C#: 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.Collections; using System.Diagnostics;

using System.Runtime.InteropServices; using System.IO;

namespace Lab8

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent(); listBox1.Items.Add("Сейчас нажато");

}

private void listBox1_KeyDown(object sender, KeyEventArgs e)

{

listBox1.Items[0] = ("Отжата: " + e.KeyData.ToString());

}

private void listBox1_KeyPress(object sender, KeyPressEventArgs e)

{

listBox1.Items[0] = ("Введена: " +

e.KeyChar);

}

private void listBox1_KeyUp(object sender, KeyEventArgs e)

{

listBox1.Items[0] = ("Нажата: " + e.KeyData.ToString());

172

}

}

}

Реализация вывода состояния клавиши представлена на рис. 75.

Рис. 75. Вывод состояния клавиши

 

 

 

Таблица 8

 

Коды виртуальных клавиш

Symbolic

 

Value

Keyboard (or mouse) equivalent

 

constant name

 

(hexadecimal)

 

 

 

 

 

VK_LBUTTON

 

01

Left mouse button

 

 

 

 

VK_RBUTTON

 

02

Right mouse button

 

 

 

 

 

 

VK_CANCEL

 

03

Control-break processing

 

 

 

VK_MBUTTON

 

04

Middle mouse button (three-

 

 

 

 

button mouse)

 

 

 

 

VK_BACK

 

08

BACKSPACE key

 

 

 

 

VK_TAB

 

09

TAB key

 

 

 

 

 

 

VK_CLEAR

 

0C

CLEAR key

 

 

 

 

VK_RETURN

 

0D

ENTER key

 

 

 

 

VK_SHIFT

 

10

SHIFT key

 

 

 

 

 

 

VK_CONTROL

 

11

CTRL key

 

 

 

VK_MENU

 

12

ALT key

 

 

 

 

VK_PAUSE

 

13

PAUSE key

 

 

 

 

 

 

VK_CAPITAL

 

14

CAPS LOCK key

 

173

 

 

 

 

Продолжение табл. 8

Symbolic

Value

Keyboard (or mouse) equivalent

 

constant name

(hexadecimal)

 

 

 

 

 

VK_ESCAPE

1B

ESC key

 

 

 

 

VK_SPACE

20

SPACEBAR

 

 

 

 

 

VK_PRIOR

21

PAGE UP key

 

 

 

VK_NEXT

22

PAGE DOWN key

 

 

 

 

VK_END

23

END key

 

 

 

 

 

VK_HOME

24

HOME key

 

 

 

VK_LEFT

25

LEFT ARROW key

 

 

 

 

VK_UP

26

UP ARROW key

 

 

 

 

 

VK_RIGHT

27

RIGHT ARROW key

 

 

 

VK_DOWN

28

DOWN ARROW key

 

 

 

 

VK_SELECT

29

SELECT key

 

 

 

 

 

VK_PRINT

2A

PRINT key

 

 

 

VK_EXECUTE

2B

EXECUTE key

 

 

 

 

VK_SNAPSHOT

2C

PRINT SCREEN key

 

 

 

 

 

VK_INSERT

2D

INS key

 

 

 

VK_DELETE

2E

DEL key

 

 

 

 

VK_HELP

2F

HELP key

 

 

 

 

 

 

30

0 key

 

 

 

 

31 (до 39)

1 key (9 key)

 

 

 

 

 

41 (до 49)

A key (I key)

 

 

 

 

 

 

4A

J key

 

 

 

 

4B

K key

 

 

 

 

 

4C

L key

 

 

 

 

 

 

4D

M key

 

 

 

 

4E

N key

 

 

 

 

 

4F

O key

 

 

 

 

 

 

50 (до 59)

P key (Y key)

 

174

 

 

 

 

Продолжение табл. 8

Symbolic

Value

Keyboard (or mouse) equivalent

 

constant name

(hexadecimal)

 

 

 

 

 

 

5A

Z key

 

 

 

 

VK_F1

70

F1 key

 

 

 

 

 

VK_F2

71

F2 key

 

 

 

VK_F3

72

F3 key

 

 

 

 

VK_F4

73

F4 key

 

 

 

 

 

VK_F5

74

F5 key

 

 

 

VK_F6

75

F6 key

 

 

 

 

VK_F7

76

F7 key

 

 

 

 

 

VK_F8

77

F8 key

 

 

 

VK_F9

78

F9 key

 

 

 

 

VK_F10

79

F10 key

 

 

 

 

 

VK_F11

7A

F11 key

 

 

 

VK_F12

7B

F12 key

 

 

 

 

VK_NUMLOCK

90

NUM LOCK key

 

 

 

 

 

VK_SCROLL

91

SCROLL LOCK key

 

 

 

VK_LSHIFT

A0

Left SHIFT key

 

 

 

 

VK_RSHIFT

A1

Right SHIFT key

 

 

 

 

 

VK_LCONTROL

A2

Left CONTROL key

 

 

 

VK_RCONTROL

A3

Right CONTROL key

 

 

 

 

 

Задание 2. Разработать программу, позволяющую по установленной в программе горячей клавише возвращать активность приложения.

Ход выполнения:

Реализация программы с помощью функции API на языке программирования Object Pascal.

175

нем.
ру:

1. В Delphi создать проект на диске с уникальным име- 2. В разделе Private надо описать следующую процеду-

procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;

3.Листинг процедуры имеет следующий вид: procedure TForm1.WMHotKey(var Message: TMessage); begin

application.Restore;

application.BringToFront; showmessage('Нажата CTRL-F7'); end;

4.В событие формы OnActivate добавить оператор, позволяющий назначить горячую клавишу:

RegisterHotKey(Form1.Handle, 123, mod_control, VK_F7);

5.В событие формы OnDestroy добавить оператор, отменяющий горячие клавиши:

UnregisterHotKey(Handle, 123);

6.Изменить горячую клавишу в программе.

Листинг программы на языке C#:

//Окно исчезает

if (e.KeyCode == Keys.F1)

if (this.Opacity == 1) this.Opacity = 0; else this.Opacity = 1;

//Окно минимизируется/максимизируется if (e.KeyCode == Keys.F2)

if (this.WindowState == FormWindowState.Normal) this.WindowState = FormWindowState.Maximized;

else this.WindowState = FormWindowState.Normal;

176

Задание 3. Разработать программу, позволяющую перехватить нажатие клавиш, с использованием стандартных событий объекта Form.

Ход выполнения:

(на языке программирования Object Pascal)

1.В Delphi создать проект на диске с уникальным именем.

2.В событие формы OnKeyDown добавить оператор:

if Key = VK_RIGHT then

3.Самостоятельно оформить экранную форму приложения, в котором надо перехватить нажатие не менее 5-ти клавиш.

Листинг программы на языке C#:

//Окно минимизируется/максимизируется if (e.KeyCode == Keys.F2)

if (this.WindowState == FormWindowState.Normal) this.WindowState = FormWindowState.Maximized; else this.WindowState = FormWindowState.Normal;

Задание 4. Разработать программу, позволяющую менять раскладку клавиатуры.

Ход выполнения:

(на языке программирования Object Pascal)

1.В Delphi создать проект на диске с уникальным именем.

2.В программе использовать переменную Layout

Layout: array[0.. KL_NAMELENGTH] of char;

3.На форме создать объекты Button1, Button2, Edit, которые позволят переключать раскладку клавиатуры с русской на английскую и проверить работоспособность переключения.

177

4. Для русской раскладки клавиатуры используется функция:

LoadKeyboardLayout( StrCopy (Layout,'00000419'),KLF_ACTIVATE)

Для английской раскладки клавиатуры – функция: LoadKeyboardLayout(StrCopy( Lay-

out,'00000409'),KLF_ACTIVATE)

Листинг программы на языке C#:

//Меняет раскладку клавиатуры if (e.KeyCode == Keys.F3)

if (lang)

{

//Меняем язык с помощью WinAPI-функции

Win32API.LoadKeyboardLayout("00000419", 1); //Выводим на экран результат изменения lLog.Items[1] = "RUS";

//Запоминаем, что текущий язык изменен lang = false;

}

else

{

Win32API.LoadKeyboardLayout("00000409", 1); lLog.Items[1] = "ENU";

lang = true;

}

Задание 5. Дан листинг программы запуска внешнего приложения и ожидания его завершения. Подключите ее к программе предыдущего задания и замените внешнее приложение.

Листинг программы на языке Object Pascal с функцией

API:

procedure TForm1.Button1Click(Sender: TObject); var

178

si : Tstartupinfo;

p : Tprocessinformation; begin

FillChar( Si, SizeOf( Si ) , 0 ); with Si do begin

cb := SizeOf( Si);

dwFlags := startf_UseShowWindow; wShowWindow := 4;

end;

Application.Minimize;

Createprocess(nil,'notepad.exe',nil,nil,false, Create_default_error_mode,nil,nil,si,p); Waitforsingleobject(p.hProcess,infinite); Application.Restore;

end;

Листинг программы на языке С#:

//Запускаем блокнот

if (e.KeyCode == Keys.F4)

{

//создаем новый процесс

Process p = new Process();

//Задаем путь к файлу. Environment.SystemDirectory – //путь к системной папке

p.StartInfo.FileName = (Environment.SystemDirectory+@"\notepad.exe");

//Запускаем процесс p.Start();

}

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

Просмотреть функции API, описанные выше и относящиеся к данному заданию, применить их в приложении (самостоятельно).

179

Выполнение задания:

Листинг программы на языке С #: internal sealed class Win32API

{

[DllImport("user32.dll")]

public static extern long LoadKeyboardLayout( string pwszKLID, // input locale identifier

uint Flags

// input locale identifier options

);

 

}

[DllImport("user32.dll")]

static extern bool GetCursorPos(ref Point lp);

private void timer1_Tick(object sender, EventArgs e)

{

Point p = new Point(); // Point это тип переменной (точка или пиксель)

GetCursorPos(ref p);

label1.Text = "X = " + p.X.ToString(); label2.Text = "Y = " + p.Y.ToString();

} // декларация API функции GetCursorPos

Вопросы по теме:

1.Функции ОС по управлению устройствами ввода-

вывода.

2.Типы устройств ввода-вывода.

3.Организация программного обеспечения вводавывода. Основные идеи.

4.Четыре слоя программного обеспечения ввода-вывода.

180