Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
ΠΠΎΠ½ΡΠΎΠ»Ρ Π²Ρ ΡΠ°ΡΡΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΈΠ³ΡΠ°Ρ ΠΈ, Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ°, Π·Π°Ρ ΠΎΡΠΈΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΈΠ³ΡΠ΅. ΠΡΠΈΠΌΠ΅Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° - ΠΏΡΠΎΠ΅ΠΊΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 09 - ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π² ΡΡΠΎΠΌ. ΠΠ½ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΠΌ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ³ΡΡ: ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ <Π’Π°b> Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄ (ΡΠΈΡ. 5.9).
Π ΠΈΡ. 5.9. ΠΠ°ΡΠ° ΠΈΠ³ΡΠ° ΠΎΠ±Π·Π°Π²Π΅Π»Π°ΡΡ ΠΊΠΎΠ½ΡΠΎΠ»ΡΡ
Π― ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π» ΡΠ΅Π°ΠΊΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΎΠ΄Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΏΠΎΡΠ»Π΅ Π²Π²ΠΎΠ΄Π° Exit ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π²Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡ ΠΎ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ.
ΠΠΎΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π²ΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ°Π·Π°ΠΌΠΈ:
rcRectConsole : TRECT; // ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ
ConsoleHeight : Integer =0; // Π’Π΅ΠΊΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
ConsoleLive : BOOL = False; // Π€Π»Π°Π³, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ
TextConsolel : String = '> Initialization....OK'; // Π‘ΡΡΠΎΠΊΠΈ Π²ΡΠ²ΠΎΠ΄Π°
TextConsole2 : String = '> Loading .......OK';
TextConsole3 : String = '>_';
ΠΠ»Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Ρ Π·Π°Π²Π΅Π» ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ, Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±Π΅Π»ΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ:
ZeroMemory(@ddsd, SizeOf(ddsd));
with ddsd do begin
dwSize := SizeOf(ddsd);
dwFlags := DDSD__CAPS or DDSD_HEIGHT or DDSD_WIDTH;
ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;
dwWidth := 640;
dwHeight := 100;
end;
hRet := FDD.CreateSurface(ddsd, FDDSConsole, nil);
if Failed (hRet) then ErrorOut(hRet, 'CreateSurface1);
hRet := FDDSConsole.SetPalette(FDDPal) ;
if Failed (hRet) then ErrorOut(hRet, 'SetPalette');
ZeroMemory(gddbltfx, SizeOf(ddbltfx));
ddbltfx.dwSize := SizeOf(ddbltfx);
ddbltfx.dwFillColor :=RGB (255, 255, 255);
FDDSConsole.Bit(nil, nil, nil, DDBLT COLORFILL or DDBLT WAIT, @ddbltfx);
SetRect (rcRectConsole, 0, 0, 640, 100);
ΠΠΎΠ΄ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΌΠΎΠ½ΡΡΡΠΎΠ² ΠΈ ΠΏΡΠ»Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΠ», ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ»ΠΈΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ. Π‘Π°ΠΌΠ° ΠΆΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΡΠ΅ΡΠΎΠ²:
if ConsoleLive then begin // ΠΠ°Π΄ΠΎ Π»ΠΈ ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ
if (GlobalThisTickCount - GlobalLastTickCount > DelayConsole) then
begin // ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
Inc (ConsoleHeight, 5);
if ConsoleHeight > 100 then ConsoleHeight := 100;
SetRect (rcRectConsole, 0, 0, 640, ConsoleHeight);
end;
// Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
FDDSBack.BltFast(0, 0, FDDSConsole, @rcRectConsole, DDBLTFAST__WAIT);
end;
Π’Π΅ΠΊΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ GDI:
procedure OutText (const X, Y : Integer; const TextCon : String);
var
DC : HOC;
begin
FDDSConsole.GetDC (DC) ;
SetBkColor(DC, RGB (255, 255, 255)); // Π¦Π²Π΅ΡΠ° ΡΠΎΠ½Π° ΠΈ Π±ΡΠΊΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ
SetTextColor (DC, 0); // Π·Π°Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ
TextOut (DC, X, Y, PChar(TextCon), length (TextCon));
FDDSConsole.ReleaseDC (DC);
end;
ΠΠ΅ΠΌΠ°Π»ΠΎ Ρ Π»ΠΎΠΏΠΎΡ ΠΏΡΠΈΠ½Π΅ΡΠ»Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ <Backspace>: ΡΡΠΎΠ±Ρ ΡΡΠ΅ΡΠ΅ΡΡ ΡΡΠ°ΡΡΠΉ ΡΠ΅ΠΊΡΡ, ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΡΡΠ΄ ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ²:
if diks [DIK_TAB] and $80 <> 0 then begin // ΠΠ»Π°Π²ΠΈΡΠ° <Tab>
if not ConsoleLive then begin // ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
ConsoleHeight := 0; ConsoleLive := True;
end
else ConsoleLive := False; // ΠΡΠΊΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ
Sleep(lOO); // ΠΠ΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΠ°ΡΠ·Π°
end;
if ConsoleLive then begin // ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ»Π°Π²ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
OutText (5, 10, TextConsolel); // ΠΡΠ²ΠΎΠ΄ ΡΡΠ΅Ρ ΡΡΡΠΎΠΊ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
OutText (5, 30, TextConsole2); OutText (5, 50, TextConsole3);
if diks [DIK_RETURN] and $80 <> 0 then begin // ΠΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
// ΠΠ²Π΅Π΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° "Exit"; Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
if (TextConsole3 = '>EXIT_') or (TextConsole3 = '> EXIT_') then Close;
// ΠΠ²Π΅Π΄Π΅Π½Π° Π΄ΡΡΠ³Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΡΡΡΠΎΠΊΠΈ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΡΡ Π½Π°Π²Π΅ΡΡ
TextConsolel := ' ';
OutText (5, 10, TextConsolel); // ΠΠ°ΡΠΈΡΠ°Π΅ΠΌ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ
TextConsolel := TextConsole2; // Π‘ΡΡΠΎΠΊΠ° ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π²Π²Π΅ΡΡ
TextConsole2 := ' ' ;
OutText (5, 30, TextConsole2);
TextConsole2 := '> Command : ' + Copy (TextConsole3, 2,
length (TextConsoleS) - 2); // Π Π΅Π°ΠΊΡΠΈΡ Π½Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ -
// Π²ΡΠ²ΠΎΠ΄ ΡΡ Π°
TextConsoleS := ' ';
OutText (5, 50, TextConsoleS);
TextConsoleS := '>_'; // ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΠ° ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»Π°ΡΡ Π² ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅
Sleep(100);
end;
if diks [DIK_BACKSPACE] and $80 <> 0 then begin // ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡΠ°
// <Backspace>
TextConsole3 := ' ';
OutText (5, 50, TextConsoleS); // Π‘ΡΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ
TextConsoleS := '>_';
OutText (5, 50, TextConsoleS);
end;
for i := DIK_Q to DIK_M do // ΠΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ Π±ΡΠΊΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ
if diks [i] and $80 <> 0 then begin // ΠΠ°ΠΆΠ°ΡΠ° ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΊΠ»Π°Π²ΠΈΡΠ° Ρ Π±ΡΠΊΠ²ΠΎΠΉ
if length (TextConsoleS) < 20 then begin // ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ
// ΠΠ΅ΡΠ΅Π΄ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π±ΡΠΊΠ²Ρ Π½Π°ΠΆΠ°ΡΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡΠΈ
TextConsoleS := Copy (TextConsoleS, I, length (TextConsoleS) - 1) +
ScanToChar (i) +'_';
OutText (5, 50, TextConsoleS); // ΠΡΠ²ΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅ΠΉΡΡ ΡΡΡΠΎΠΊΠΈ
Sleep(100);
end;
end;
end;
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ΠΎΠ±ΡΡΠ°ΠΉΠ½ΠΎ Π±ΡΡΡΡΠΎ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ sleep ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠ°ΡΠ·Ρ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΠ΅ΠΊΡΠ° Π·Π°Π»ΠΈΠΏΠ°Π½ΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ. ΠΡΠ° ΠΏΠ°ΡΠ·Π° Π΄Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΏΡΡΡΠΈΡΡ Π½Π°ΠΆΠ°ΡΡΡ ΠΊΠ»Π°Π²ΠΈΡΡ.
ΠΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΠ΅ ΠΎΠΊΠ½Π°
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΠΎΠΊΠ½Π°Ρ , ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΄Π΅Π»ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΡΡΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ. ΠΡΠΈΠΌΠ΅Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° (ΠΏΡΠΎΠ΅ΠΊΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 10) ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΡΠΊΡΠ°Π½Π° Ρ ΠΏΠ»Π°Π²Π°ΡΡΠΈΠΌΠΈ ΡΡΠ±ΠΊΠ°ΠΌΠΈ. Π ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΡ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π·Π°ΠΏΡΠΎΡ ΠΏΠ°ΡΠΎΠ»Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΡΠΊΡΠ°Π½Π° ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ, Π½ΠΎ Π²ΡΠ·ΠΎΠ² ΠΈΡ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ Π²Π²ΠΎΠ΄Π° ΠΏΠ°ΡΠΎΠ»Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠΌ, ΠΏΠ°ΡΠΎΠ»Ρ Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΊΡΠ°Π½ΠΎΠ². ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΏΠ°ΡΠΎΠ»Ρ, Ρ ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ΅Π΅ΡΡΡΠ΅, Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π²Π²ΠΎΠ΄ ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΠΈΠ»ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊΡΡΡΠΎΡΠ° ΠΌΡΡΠΈ.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π·Π°Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ:
procedure TfrmDD.RunSetPassword;
type // Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ
TPCPAFunc = function(A : PChar; Parent : hWnd; Π, Π‘ : Integer) :
Integer; stdcall;
var
Lib : THandle; // Π‘ΡΡΠ»ΠΊΠ° Π½Π° DLL
PCPAFunc : TPCPAFunc; // ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ
begin
Lib := .LoadLibrary('MPR.DLL1); // ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° DLL
if Lib > 32 then begin // ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π½ΡΠΆΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
@PCPAFunc := GetProcAddress(Lib, 'PwdChangePasswordA');
// ΠΠ°Π΄Π°Π΅ΠΌ ΠΏΠ°ΡΠΎΠ»Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΊΡΠ°Π½Π°
if @PCPAFunc ΠΎ nil then PCPAFunc('SCRSAVE', StrToInt(ParamStr(2)),
0, 0);
FreeLibrary(Lib); // ΠΡΠ³ΡΡΠΆΠ°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ
end;
end;
Π Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ /Π°, Ρ. Π΅. Π² ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡ ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΠ°ΡΡΠ°Π²ΠΊΠ° (ΡΠΌ. ΡΠΈΡ. 4.3).
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΠΈΠ»ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊΡΡΡΠΎΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°ΠΌΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π»ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΡΠΊΡΠ°Π½Π°, ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³ Π²Π²ΠΎΠ΄Π° ΠΏΠ°ΡΠΎΠ»Ρ:
function TfrmDD.TestPassword : BOOL;
type
// Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ, ΡΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠΎΠΌ, ΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
TVSSPFunc = function(Parent : hWnd) : BOOL; stdcall;
var
Key : hKey;
D1,D2 : Integer;
Value : Integer;
Lib : THandle;
VSSPFunc : TVSSPFunc;
begin
Result := True;
// ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΡΠ΅Π΅ΡΡΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ API
if RegOpenKeyEx(hKey_Current_User, 'Control Panei\Desktop', 0,
Key_Read, Key) = Error_Success then begin
D2 := SizeOf(Value);
// ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π»ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ
if RegQueryValueEx(Key, 'ScreenSaveUsePassword', nil, @D1,
@Value,@D2) = Error_Success then begin if Value <> 0 then begin
// ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π²Π²ΠΎΠ΄Π° ΠΏΠ°ΡΠΎΠ»Ρ
Lib := LoadLibraryf'PASSWORD.CPL');
if Lib > 32 then begin
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π°
SVSSPFunc := GetProcAddress(Lib, 'VerifyScreenSavePwd');
// ΠΠ° Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΊΡΡΡΠΎΡ
ShowCursor (True) ;
// ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³
if @VSSPFunc <> nil then Result := VSSPFunc(Handle);
ShowCursor(False); // ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ, Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π½Π΅ Π΄Π΅Π»Π°ΡΡ
FreeLibrary(Lib); // ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ ΠΏΠ°ΠΌΡΡΡ
end;
end;
end;
RegCloseKey(Key);
end;
end;
Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅: Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ "ΠΏΠΎΠ²Π΅ΡΡ " ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ (ΡΠΈΡ. 5.10).
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄Π΅Π» Π΅Π³ΠΎ, ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Π½Π°ΡΠ΅ΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ TestPassword Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ GDI:
FDD.FlipTcGDISurface;
To Π΅ΡΡΡ Π² ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ·Π°Π½ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° FlipToGDisurface, Π° ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠΊΡΠ°Π½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΌΠ½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈΡΡ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»ΠΈ ΡΠΊΡΠ°Π½Π°, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»Π°ΠΌΠΈ, Π°Π²ΡΠΎΡΡ ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΠ»ΠΈΡΡ ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π°: ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²Π²ΠΎΠ΄ΠΈΡΡ "Π²ΡΠ»Π΅ΠΏΡΡ", Π½Π΅ Π²ΠΈΠ΄Ρ ΠΎΠΊΠ½ΠΎ Π²Π²ΠΎΠ΄Π° ΠΏΠ°ΡΠΎΠ»Ρ, Π·Π°ΠΊΡΡΡΠΎΠ΅ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΎΠΉ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ. ΠΠ°ΠΌΡΡΡΡ ΠΎΠ± ΡΡΠΎΠΌ, Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ» ΡΠ°Π±ΠΎΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ Π½Π° ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°Ρ , ΠΈ ΠΌΠΎΠ³Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π΅ Π²ΡΡΡΠ΅ΡΠΈΠ» Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ.
Π§ΡΠΎΠ±Ρ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ, ΡΠΎΡΠ½Π΅Π΅, Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ ΠΊΠ»Π°Π²ΠΈΡ <Alt>+<Tab> ΠΈ <CtrI>+<Alt>+<Del>, Π½Π° Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΡΠΊΡΠ°Π½Π°, ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° ΠΊΠΎΠ΄Π°:
SystemParametersInfo(SPI SCREENSAVERRUNNING, 1, nil, 0);
ΠΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ΠΎ Π½Π΅ Π·Π°Π±ΡΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ ΡΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ° ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π½ΠΎ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π°Π΄Π°Π΅ΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° GDI-Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π°Π΄Π΅ΡΡΡ, ΡΠ΄Π΅Π»Π°Π΅Ρ Π²ΠΈΠ΄ΠΈΠΌΡΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ°ΡΠ΅Π»Ρ ΠΊΠ½ΠΈΠ³ΠΈ, Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΌ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°Π·Π²Π°ΡΡ Π½Π΅Π»ΡΠ·Ρ. ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΏΠΎ ΡΠΊΡΠ°Π½Ρ ΠΎΠ½ΠΎ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅Π΄Ρ, ΡΠ°ΡΡΠΈΡΠ°Ρ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΈ ΠΎΠ±Π½Π°ΠΆΠ°Ρ ΠΎΠΊΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΊΡΠ°Π½ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ΅ΡΡΠΌ).
Π’Π°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΡΠ΅ΡΠ±Π΅Π½ Π΅ΡΠ΅ ΠΏΠΎ ΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π½Π°ΠΌΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ .