Dưới đây là một giải pháp làm việc:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function GetPassword(const InputMask: Char = '*'): string;
var
OldMode: Cardinal;
c: char;
begin
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), OldMode);
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), OldMode and not (ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT));
try
while not Eof do
begin
Read(c);
if c = #13 then // Carriage Return
Break;
Result := Result + c;
if c = #8 then // Back Space
Write(#8)
else
Write(InputMask);
end;
finally
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), OldMode);
end;
end;
begin
try
Writeln(Format(sLineBreak + 'pswd=%s',[GetPassword]));
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Cập nhật: Lưu ý rằng đoạn mã trên xử lý các backspaces trực quan, nhưng vẫn giữ chúng được nhúng trong mật khẩu, trong đó có thể không phải những gì bạn muốn.
Trong trường hợp đó đoạn mã sau sẽ lọc chúng ra:
if c = #13 then // Carriage Return
Break;
if (c = #8) and (Length(Result) > 0) then // Back Space
begin
Delete(Result, Length(Result), 1);
Write(#8);
end
else
begin
Result := Result + c;
Write(InputMask);
end;
Nguồn
2010-09-08 20:49:59
nếu bạn đang không sử dụng một TEdit, những gì kiểm soát nào bạn muốn sử dụng cho người dùng gõ vào tên người dùng và mật khẩu? – Leslie
Trong cửa sổ bảng điều khiển. Anh ta đề cập đến nó. – zz1433