3468
.pdfusing 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