...
Листинг 3.23.
Запуск и остановка огней
var
initCaps, initNum, initScroll: Boolean; //Первоначальные
//состояния клавиш
curCaps, curNum, curScroll: Boolean; //Текущие состояния
//клавиш
procedure TForm1.cmbStartClick(Sender: TObject);
begin
if cmbStart.Caption = \'Старт\' then
begin
//Сохраняем первоначальные состояния клавиш
initCaps := (GetKeyState(VK_CAPITAL) and 1) <> 0;
initNum := (GetKeyState(VK_NUMLOCK) and 1) <> 0;
initScroll := (GetKeyState(VK_SCROLL) and 1) <> 0;
//Включаем только Caps Lock
if not initCaps then PressKey(VK_CAPITAL);
curCaps := True;
if initNum then PressKey(VK_NUMLOCK);
curNum := False;
if initScroll then PressKey(VK_SCROLL);
curScroll := False;
//Запускаем «бегущие огни»
Timer1.Interval := StrToInt(txtInterval.Text);
Timer1.Enabled := True;
cmbStart.Caption := \'Стоп\
end
else
begin
//Останавливаем «бегущие огни»
Timer1.Enabled := False;
cmbStart.Caption := \'Старт\
//Восстанавливаем первоначальные состояния клавиш
if initCaps <> curCaps then PressKey(VK_CAPITAL);
if initNum <> curNum then PressKey(VK_NUMLOCK);
if initScroll <> curScroll then PressKey(VK_SCROLL);
end;
end;
В начале листинга 3.23 приведены используемые глобальные переменные:
• initCaps, initNum, initScroll – для сохранения первоначального состояния клавиш Caps Lock, Num Lockи Scroll Lockс целью его восстановления при остановке огней, чтобы не раздражаться необходимостью вручную устанавливать состояния этих клавиш;
• curCaps, curNum, curScroll – для быстрого определения текущего состояния клавиш (вместо постоянного обращения к функциям типа GetKeyboardState).
Перемещение огней происходит при каждом срабатывании таймера Timer1(листинг 3.24).
...
Листинг 3.24.
Перемещение огней
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Изменяем состояние лампочек на клавиатуре
if curCaps then
begin
//С Caps Lock на Num Lock
PressKey(VK_NUMLOCK);
PressKey(VK_CAPITAL);
curCaps := False;
curNum := True;
end
else if curNum then
begin
//С Num Lock на Scroll Lock
PressKey(VK_SCROLL);
PressKey(VK_NUMLOCK);
curNum := False;
curScroll := True;
end
else
begin
//С Scroll Lock на Caps Lock
PressKey(VK_CAPITAL);
PressKey(VK_SCROLL);
curScroll := False;
curCaps := True;
end;
end;
...
Примечание
Если у вашей клавиатуры порядок следования лампочек отличается от приведенного в примере (в какую-нибудь сторону), то следует изменить порядок переключения в листинге 3.24, чтобы «бегущие огни» действительно «бежали».
Теперь можно запустить соответствующую заставку и получить неплохое украшение, например, для новогодней елки… из компьютера.
Глава 4 Диски, каталоги, файлы
• Диски
• Каталоги и пути
• Файлы
В этой главе вы познакомитесь с некоторыми возможностями получения полезной информации о файловой системе (и от файловой системы). Примеры главы целиком основаны на использовании API-функций для получения информации, так сказать, из первых рук. Конечно, разработчики Borland не проигнорировали эту тему при написании библиотеки для Delphi: в модуле SysUtils можно найти ряд функций, позволяющих работать с объектами файловой системы. Поэтому в этой главе в основном рассматриваются API-функции, позволяющие получить информацию, недоступную при использовании процедур и функций модуля SysUtils, дабы полностью не дублировать функционал этой библиотеки.
Начнем с получения информации о дисках компьютера. Как вы, наверное, не раз могли убедиться, ряд приложений (хотя бы тот же Internet Explorer) обладают гораздо большей информацией о дисках, нежели их обозначение (буква) или размер. Далее рассмотрено, как определить буквы всех установленных на компьютере дисков, метки дисков, серийные номера томов и другую информацию о файловой системе. Вы также узнаете, как программно поменять метки дисков.
Все рассмотренные ниже функции работы с дисками вы можете найти в модуле DriveTools, расположенном на диске, прилагаемом к книге, в папке с названием раздела.
Сбор информации о дисках
Итак, начнем по порядку. Получить список дисков компьютера (строк вида<���буква>: \) поможет функция из листинга 4.1.
...
Листинг 4.1.
Определение букв дисков
function GetDriveLetters(letters: TStrings):Integer;
var
buffer: String;
i, len, start: Integer;
begin
SetLength(buffer, 110);
Читать дальше
Конец ознакомительного отрывка
Купить книгу