2010-09-08 107 views
8

我正在使用BDE 2006編寫控制檯應用程序,我希望它能夠提示輸入密碼字符串,並在用戶輸入時用「*」標記。我環顧四周,但我找不到如何做到這一點的例子。我看到的一切都是如何在TEdit中做到這一點。任何關於如何完成這一點的指針?控制檯應用程序中的掩碼密碼輸入

由於提前,

尼克

+0

如果你不打算使用TEDIT,你怎麼想控制使用用戶的用戶名和密碼類型? – Leslie 2010-09-08 19:42:45

+2

在控制檯窗口中。他提到它。 – zz1433 2010-09-08 19:45:35

回答

8

這裏是一個有效的解決方案:

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. 

更新:請注意,上面的代碼處理退格在視覺上,但讓他們嵌入密碼,你想要什麼這可能不是。
在這種情況下,下面的代碼將篩選出來:

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

僅僅通過將else result = result + c移動到else子句來添加#8而不是先添加它然後刪除它會更容易嗎? – 2011-08-04 16:02:51

+0

如果他們做退格,你會想刪除前面的字符。 – 2011-08-05 21:02:35

+0

啊,是的,我明白你的意思了。 – 2011-08-06 15:48:30

2

This Works。

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.