//ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ 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, Π΄Π°Π±Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
4.1. ΠΠΈΡΠΊΠΈ
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΈΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. ΠΠ°ΠΊ Π²Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π½Π΅ ΡΠ°Π· ΠΌΠΎΠ³Π»ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Ρ ΠΎΡΡ Π±Ρ ΡΠΎΡ ΠΆΠ΅ Internet Explorer) ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ Π΄ΠΈΡΠΊΠ°Ρ , Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Π±ΡΠΊΠ²Π°) ΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ. ΠΠ°Π»Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π±ΡΠΊΠ²Ρ Π²ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ Π΄ΠΈΡΠΊΠΎΠ², ΠΌΠ΅ΡΠΊΠΈ Π΄ΠΈΡΠΊΠΎΠ², ΡΠ΅ΡΠΈΠΉΠ½ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΠΌΠΎΠ² ΠΈ Π΄ΡΡΠ³ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΌΠ΅ΡΠΊΠΈ Π΄ΠΈΡΠΊΠΎΠ².
ΠΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ Π½ΠΈΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΈΡΠΊΠ°ΠΌΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ DriveTools, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ Π½Π° Π΄ΠΈΡΠΊΠ΅, ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊ ΠΊΠ½ΠΈΠ³Π΅, Π² ΠΏΠ°ΠΏΠΊΠ΅ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π°.
Π‘Π±ΠΎΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΈΡΠΊΠ°Ρ
ΠΡΠ°ΠΊ, Π½Π°ΡΠ½Π΅ΠΌ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ. ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΈΡΠΊΠΎΠ² ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° (ΡΡΡΠΎΠΊ Π²ΠΈΠ΄Π°<Π±ΡΠΊΠ²Π°>: \) ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 4.1.
...ΠΠΈΡΡΠΈΠ½Π³ 4.1.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡΠΊΠ² Π΄ΠΈΡΠΊΠΎΠ²
function GetDriveLetters(letters: TStrings):Integer;
var
buffer: String;
i, len, start: Integer;
begin
SetLength(buffer, 110);
len := GetLogicalDriveStrings(110, PAnsiChar(buffer));
//Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ ΡΡΡΠΎΠΊΡ Π²ΠΈΠ΄Π° \'c:\#0d:\#0β¦#0#0\',
//Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ GetLogicalDriveStrings
start := 1;
for i := 2 to len do
if (buffer[i] = #0) and (start <> i) then
begin
//ΠΠ°ΡΠ»ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ°
letters.Append(Copy(buffer, start, iβstart));
start := i+1;
end;
GetDriveLetters := letters.Count;
end;
Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΅Π³ΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ Ρ ΠΏΡΡΡΠΌΠΈ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΠΏΠ°ΠΏΠΎΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π΄ΠΈΡΠΊΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ: \). ΠΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΡΡΠΎΠΈΡ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΡΠ΅ΠΉ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ, Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ API-ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ GetLogicalDriveStrings. Π€ΡΠ½ΠΊΡΠΈΡ GetDriveLetters Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ letters.
ΠΡΠΎΠΌΠ΅ API-ΡΡΠ½ΠΊΡΠΈΠΈ GetLogicalDriveStrings, Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, Π·Π° ΠΊΠ°ΠΊΠΈΠΌΠΈ Π±ΡΠΊΠ²Π°ΠΌΠΈ Π·Π°ΠΊΡΠ΅ΠΏΠ»Π΅Π½Ρ Π΄ΠΈΡΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ β GetLogicalDrives. ΠΠ½Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° DWORD, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΡΠΎΠ±ΠΎΠΉ Π±ΠΈΡΠΎΠ²ΡΡ ΠΌΠ°ΡΠΊΡ. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡΠ° ΠΌΠ°ΡΠΊΠΈ (ΠΎΡ 1 Π΄ΠΎ 26) ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ Π»ΠΈΠ±ΠΎ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π΄ΠΈΡΠΊΠ° ΠΏΠΎΠ΄ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π½ΠΎΠΌΠ΅ΡΡ Π±ΡΠΊΠ²ΠΎΠΉ Π»Π°ΡΠΈΠ½ΡΠΊΠΎΠ³ΠΎ Π°Π»ΡΠ°Π²ΠΈΡΠ°. ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· ΠΌΠ°ΡΠΊΠΈ (ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΈΡΠΊΠΎΠ²) ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.2.
...ΠΠΈΡΡΠΈΠ½Π³ 4.2.
Π‘ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΈΡΠΊΠΎΠ²
function GetDriveLetters(letters: TStrings):Integer;
var
mask: DWORD;
i: Integer;
letter: Char;
begin
//ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΌΠ°ΡΠΊΡ, Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΡΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄ΠΈΡΠΊΠΎΠ²
mask := GetLogicalDrives();
//Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ ΠΌΠ°ΡΠΊΡ (ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΡΡ 26 Π±ΠΈΡΠΎΠ²)
i := 1;
for letter := \'A\' to \'Z\' do
begin
if mask and i <> 0 then
//ΠΡΡΡ Π΄ΠΈΡΠΊ ΠΏΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π±ΡΠΊΠ²ΠΎΠΉ
letters.Append(letter + \':\\');
i := i * 2; //ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ Π±ΠΈΡΡ
end;
GetDriveLetters := letters.Count;
end;
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π½Π° Π΄ΠΈΡΠΊΠ΅ (Π»ΠΈΡΡΠΈΠ½Π³ 4.3).
...ΠΠΈΡΡΠΈΠ½Π³ 4.3.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π΄ΠΈΡΠΊΠ°
//Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΠΈΡΠΊΠ° Π² Π±Π°ΠΉΡΠ°Ρ
function GetDriveSize(root: String): Int64;
var
freeToCaller, totalBytes, freeBytes: Int64;
begin
if GetDiskFreeSpaceEx(PAnsiChar(root), freeToCaller,
totalBytes, PLargeInteger(Addr(freeBytes))) <> False
then
GetDriveSize := totalBytes
else
GetDriveSize := -1;
end;
//Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π½Π° Π΄ΠΈΡΠΊΠ΅ (Π² Π±Π°ΠΉΡΠ°Ρ )
function GetDriveFreeSpace(root: String): Int64;
var
freeToCaller, totalBytes, freeBytes:Int64;
begin
if GetDiskFreeSpaceEx(PAnsiChar(root), freeToCaller,
totalBytes, PLargeInteger(Addr(freeBytes))) <> False
then
GetDriveFreeSpace := freeBytes
else
GetDriveFreeSpace := β1;
end;
Π ΠΎΠ±Π΅ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 4.3 Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ Π΄Π²ΡΡ ΡΠ°Π·Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ API-ΡΡΠ½ΠΊΡΠΈΡ GetDiskFreeSpaceEx:
...function GetDiskFreeSpaceEx(lpDirectoryName: PChar;
var lpFreeBytesAvailableToCaller,
lpTotalNumberOfBytes;
lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;
Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΡΡ (Π»ΡΠ±ΠΎΠΉ) ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅ΠΌ Π΄ΠΈΡΠΊΠ΅ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
β’ lpFreeBytesAvailableToCaller β ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΏΠΎΠ΄ ΡΡΠΈΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ (Π² Π±Π°ΠΉΡΠ°Ρ );
β’ lpTotalNumberOf Bytes β ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΠΈΡΠΊΠ° (Π² Π±Π°ΠΉΡΠ°Ρ );
β’ lpTotalNumberOf FreeBytes β ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π½Π° Π΄ΠΈΡΠΊΠ΅ (Π² Π±Π°ΠΉΡΠ°Ρ ).
ΠΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡΡΡΡ 64-Π±ΠΈΡΠ½ΡΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΎΠΏΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌΠΈ Π΄ΠΈΡΠΊΠΎΠ² Π±ΠΎΠ»Π΅Π΅ 4 ΠΠ±Π°ΠΉΡ. ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ GetDiskFreeSpaceEx ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠΌ, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ False. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π»ΠΈΡΡΠΈΠ½Π³Π° 4.3 Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ -1, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ β ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π½Π° Π΄ΠΈΡΠΊΠ°Ρ . ΠΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄ΠΈΡΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ API-ΡΡΠ½ΠΊΡΠΈΠΈ GetVolumelnformation. ΠΠ½Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
...function GetVolumeInformation(lpRootPathName: PChar;
lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD;
lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength,
lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar;
nFileSystemNameSize: DWORD): BOOL;
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ Π·Π° ΡΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ GetVolumelnformation ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ. Π§ΡΠΎΠ±Ρ Π½Π΅ Π²Π΄Π°Π²Π°ΡΡΡΡ Π² Π΄ΠΎΠ»Π³ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π΅Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ (Π»ΠΈΡΡΠΈΠ½Π³ 4.4).
...ΠΠΈΡΡΠΈΠ½Π³ 4.4.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΈΡΠΊΠ΅
//Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π΄ΠΈΡΠΊΠ΅
//ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ False, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°
function GetDriveInformation(root: String;
var info: DriveInfo):Boolean;
var
bufDriveName, bufFSNAme: String;
SN: DWORD;
maxFileName, fsOptions: Cardinal;
begin
SetLength(bufDriveName, 101);
SetLength(bufFSName, 101);
//ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΈΡΠΊΠ΅
if GetVolumeInformation(PAnsiChar(root),
PAnsiChar(bufDriveName), 100,
Addr(SN), maxFileName, fsOptions,
PAnsiChar(bufFSName), 100) <> False
then
begin
//ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ Π΄ΠΈΡΠΊΠ΅
with info do
begin
DriveLabel := bufDriveName;
FileSystemName := bufFSName;
SerialNumber := SN;
MaxFileNameLen := maxFileName;
//..ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
with info.FileSystemOptions do
begin
CaseSensitive := fsOptions and FS_CASE_SENSITIVE <> 0;
SupportCompression := fsOptions and
FS_FILE_COMPRESSION <> 0;
IsCompressed := fsOptions and FS_VOL_IS_COMPRESSED <> 0;
end;
end;
//Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ
GetDriveInformation := True;
end
else
//ΠΡΠΈΠ±ΠΊΠ°
GetDriveInformation := False;
end;
ΠΡΠ»ΠΈ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π»ΠΈΡΡΠΈΠ½Π³, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ GetVolumelnf ormation, ΠΊΡΠΎΠΌΠ΅ ΠΏΡΡΠΈ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ Π΄ΠΈΡΠΊΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅:
β’ Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΠΌΠ΅ΡΠΊΠΈ Π΄ΠΈΡΠΊΠ° (ΠΈ Π΄Π»ΠΈΠ½Π° ΡΡΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°);
β’ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠ° DWORD Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² Π½Π΅Π΅ ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΠΌΠ° Π΄ΠΈΡΠΊΠ° (ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΡΠΊΠ°);
β’ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠ° Cardinal Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π½Π΅ΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΡΡΠΈ (ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ);