2010-09-08 68 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.