delphi - 在控制台应用程序中屏蔽密码输入

标签 delphi console console-application

我正在使用 BDE 2006 编写一个控制台应用程序,我希望它能够在用户键入时提示输入密码字符串并用“*”屏蔽它。我环顾四周,但找不到如何执行此操作的示例。我看到的一切都是如何在 TEdit 中执行此操作。有关如何实现此目标的任何指示?

提前致谢,

尼克

最佳答案

这是一个可行的解决方案:

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.

更新:请注意,上面的代码以可视方式处理 BackSpace,但将它们嵌入到密码中,这可能不是您想要的。
在这种情况下,以下代码将过滤掉它们:

  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;

关于delphi - 在控制台应用程序中屏蔽密码输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671042/

相关文章:

python - 为什么在 Sublime Text 下写入 STD_OUTPUT_HANDLE 会崩溃?

c# - 更新数组的问题

c# - 一次读取随机长度的字符

C++ 使用 AddFontResource() 查找临时添加到系统字体表中的字体索引以在控制台中使用

delphi - Delphi系统单元中的TMonitor有什么用?

delphi - 为什么源文件创建时间戳会在保存时更新?

delphi - Embarcadero RAD Studio XE2 调试器中显示的局部变量的准确度是多少?显然1不等于1

C++ Linux控制台清除屏幕的一个区域

ruby-on-rails-3 - has_many :through NameError: uninitialized constant

listview - Delphi Tlistview 最后一行的问题