我想出了一个VBA功能,允许用户输入密码,每个按键也会输出相应的星号。我认为打印" \ b \ 0 \ b"带来"光标"返回,打印一个空字符以覆盖该位置的星号,并再次将光标带回。
Private Function GetPassword() As String
Dim sb = New StringBuilder()
While (True)
Dim ki = Console.ReadKey(True)
If (ki.Key = ConsoleKey.Enter) Then
Console.WriteLine()
Exit While
End If
If (ki.Key = ConsoleKey.Backspace) Then
If (sb.Length > 0) Then
Console.Write("\b\0\b")
sb.Length -= 1
End If
Continue While
End If
Console.Write("*")
sb.Append(ki.KeyChar)
End While
Return sb.ToString()
End Function
为了测试它我键入了正确的密码,让我们说:" Abc123"并添加了一个额外的字符,以#34; Abc1234"。
结束我按退格键来纠正我的错误和" \ b \ 0 \ b"密码被接受后打印了字符串,所以我假设这是有效的。
有没有什么办法可以保持这个功能不变但是避免将退格字符串直接打印到控制台?
答案 0 :(得分:2)
试试这个解决方案:
If (ki.Key = ConsoleKey.Backspace) Then
If (sb.Length > 0) Then
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop)
Console.Write(" ")
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop)
sb.Length -= 1
End If
Continue While
End If
将光标向左移动一步(后退一个字符),然后打印一个空格,将光标向右移动(原始位置)。然后它再次将光标向左移动以站在空间上。
这是另一种解决方案(基于@ChrisDunaway的评论):
If (ki.Key = ConsoleKey.Backspace) Then
If (sb.Length > 0) Then
Console.Write(Chr(8) & Chr(0) & Chr(8))
sb.Length -= 1
End If
Continue While
End If