如何防止退格字符串" \ b \ 0 \ b"从键入密码时打印到控制台

时间:2015-12-15 20:51:40

标签: vb.net console passwords

我想出了一个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"密码被接受后打印了字符串,所以我假设这是有效的。

有没有什么办法可以保持这个功能不变但是避免将退格字符串直接打印到控制台?

1 个答案:

答案 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