2010-09-08 32 views
8

Tôi đang viết ứng dụng bảng điều khiển bằng BDE 2006 và tôi muốn nó có thể nhắc chuỗi mật khẩu và mặt nạ bằng "*" khi người dùng nhập. Tôi đã nhìn xung quanh nhưng tôi không thể tìm thấy ví dụ về cách làm điều này. Tất cả những gì tôi thấy là làm thế nào để làm điều này trong TEdit. Bất kỳ con trỏ nào về cách thực hiện điều này?Nhập mật khẩu mặt nạ trong ứng dụng Console

Cảm ơn trước,

Nic

+0

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

+2

Trong cửa sổ bảng điều khiển. Anh ta đề cập đến nó. – zz1433

Trả lời

8

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; 
+0

Không dễ dàng hơn khi không thêm # 8 bằng cách di chuyển 'kết quả: = kết quả + c' sang mệnh đề khác, thay vì thêm nó trước, và sau đó xóa nó? –

+0

bạn sẽ muốn xóa ký tự trước đó nếu chúng làm backspace. –

+0

Ah, vâng, tôi hiểu ý của bạn là gì. –

2

Tác phẩm này.

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Windows; 

const 
    BUF_LEN = 1024; 

var 
    amt, i, cmode: cardinal; 
    buf: packed array[0..BUF_LEN - 1] of char; 

begin 
    try 

    Write('Enter password: '); 
    GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), cmode); 
    SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), cmode and not ENABLE_ECHO_INPUT); 
    ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @buf[0], BUF_LEN, amt, nil); 
    SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), cmode); 

    Writeln; 
    Writeln; 

    Writeln('You entered: '); 
    for i := 0 to amt - 3 do 
     Write(buf[i]); 
    Writeln; 
    Writeln; 

    Writeln('Done'); 
    Readln; 

    except 
    on E:Exception do 
    begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    end; 
    end; 
end. 
Các vấn đề liên quan