有没有办法回应" *"处理密码时还是其他一些字符?使用STDIN.noecho有效,但没有提供任何用户反馈。 console.cr只提供raw和noecho。
感谢。还在看......
答案 0 :(得分:2)
您使用STDIN.noecho!
走在正确的道路上有效地您需要做的是在原始模式下从STDIN
读取,并在每次按下键时回显*
。然后你要监听退格键,这样你就可以将光标向后移动一个并用空格替换,然后在用户键入另一个字符时用*替换该空格。您还需要检查终端捕获时被按下的enter
和Control+C
,并以原始模式将所有内容提供给您。
我已经根据用户Alfe在第二条评论中找到{b}实施{b}实现了这一点。 更新:将代码更改为内部块,以有望消除可能的终端问题。
# Fix for crystal bug
STDIN.blocking = true
# STDIN chars without buffering
STDIN.raw do
# Dont echo out to the terminal
STDIN.noecho do
final_password = ""
while char = STDIN.read_char
# If we have a backspace
if char == '\u{7f}'
# Move the cursor back 1 char
if final_password != ""
STDOUT << "\b \b"
STDOUT.flush
final_password = final_password[0...-1]
end
next
elsif char == '\r'
# Enter was pressed we're finished!
break
elsif char == '\u{3}'
# Control + C was pressed. Get outta here
Process.exit 0
elsif char.ascii_control?
# A Control + [] char was pressed. Not valid for a password
next
end
STDOUT << "*"
STDOUT.flush
final_password += char
end
puts final_password
end
end
# Resetting when finished
STDIN.blocking = false
如果这对您有所帮助,请务必将其标记为已接听!