Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 35

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

БозданиС консоли

Консоль Π²Ρ‹ часто Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΈ использовали Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ³Ρ€Π°Ρ… ΠΈ, навСрняка, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π² своСй ΠΈΠ³Ρ€Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° - ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…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-воспроизвСдСниС, надСюсь, сдСлаСт Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ читатСля ΠΊΠ½ΠΈΠ³ΠΈ, Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ нСльзя. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΏΠΎ экрану ΠΎΠ½ΠΎ оставляСт слСды, расчищая ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΈ обнаТая ΠΎΠΊΠ½ΠΎ прилоТСния (поэтому экран становится сСрым).

Π’Π°ΠΊΠΎΠΉ способ общСния с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΡƒΡ‰Π΅Ρ€Π±Π΅Π½ Π΅Ρ‰Π΅ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Из-Π·Π° этого я Π½Π΅ ΠΌΠΎΠ³ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для примСнСния Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ошибкС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π½Π°ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….