Saya mencoba kode berikut ...
string pass = "";
Console.Write("Enter your password: ");
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
// Backspace Should Not Work
if (key.Key != ConsoleKey.Backspace)
{
pass += key.KeyChar;
Console.Write("*");
}
else
{
Console.Write("\b");
}
}
// Stops Receving Keys Once Enter is Pressed
while (key.Key != ConsoleKey.Enter);
Console.WriteLine();
Console.WriteLine("The Password You entered is : " + pass);
Tapi dengan cara ini fungsi backspace tidak berfungsi saat mengetik kata sandi. Ada saran?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
sumber
sumber
Jawaban:
Console.Write("\b \b");
akan menghapus karakter tanda bintang dari layar, tetapi Anda tidak memiliki kode di dalamelse
blok Anda yang menghapus karakter yang sebelumnya dimasukkan dari Andapass
variabel string .Berikut kode kerja yang relevan yang harus melakukan apa yang Anda butuhkan:
sumber
' '
) di antara karakter backspace ('\b'
)."\b \b"
membawa Anda satu tempat kembali, lalu mencetak spasi (yang membawa Anda satu tempat ke depan) dan kemudian membawa Anda kembali, sehingga Anda berakhir di tempat'*'
karakter yang dihapus itu.\b
memindahkan kursor kembali satu posisi (sekarang di bawah karakter terakhir*
.[space]
Karakter "mencetak" tanda bintang, tetapi juga menggerakkan kursor satu karakter ke depan lagi, sehingga yang terakhir\b
memindahkan kursor kembali ke tempat yang terakhir*
digunakan untuk be! (Fiuh - Harapan itu masuk akal!)if (pass.Length > 0)
seharusnyaif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
kalau tidak Anda tidak akan mendapatkan karakter terakhir dari kata sandi ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
denganif (!char.IsControl(key.KeyChar))
.Untuk ini, Anda harus menggunakan System.Security.SecureString
sumber
if( pwd.Length > 0)
di pernyataan orang lain untuk menghentikan orang menghapus pertanyaan :)else
klausa terakhir akan mendapat manfaat dari tesif (!char.IsControl(i.KeyChar))
(atau paling tidakif (i.KeyChar != '\u0000')
).Solusi lengkap, vanilla C # .net 3.5+
Potong tempel :)
sumber
Mengambil jawaban teratas, serta saran dari komentarnya, dan memodifikasinya untuk menggunakan SecureString alih-alih String, uji semua kunci kontrol, dan jangan salah atau menulis "*" tambahan ke layar ketika panjang kata sandi 0, solusi saya adalah:
sumber
Milik saya mengabaikan karakter kontrol dan menangani pembungkus garis:
sumber
DELETE
karakter menghapus semua teks yang dimasukkan. Urutan kuncinya adalahCTRL + BACKSPACE
dan kode char-nya0x7f
.Input konsol baca sulit, Anda perlu menangani tombol khusus seperti Ctrl, Alt, juga tombol kursor dan Backspace / Hapus. Pada beberapa tata letak keyboard, seperti Swedish Ctrl bahkan diperlukan untuk memasukkan tombol yang ada langsung di keyboard AS. Saya percaya bahwa mencoba menangani ini menggunakan "level rendah"
Console.ReadKey(true)
hanya sangat sulit, jadi cara termudah dan paling kuat adalah dengan menonaktifkan "konsol masukan gema" selama memasukkan kata sandi menggunakan sedikit WINAPI.Sampel di bawah ini didasarkan pada jawaban untuk Baca kata sandi dari pertanyaan std :: cin .
sumber
Ini menutupi kata sandi dengan kotak merah, lalu kembali ke warna semula setelah kata sandi dimasukkan.
Ini tidak menghentikan pengguna untuk menggunakan salin / tempel untuk mendapatkan kata sandi, tetapi jika ini lebih tentang menghentikan seseorang untuk melihat dari balik bahu Anda, ini adalah solusi cepat yang bagus.
sumber
Console.CursorVisible=false
dan mengaturnya kembali ke nilai sebelumnya. Ini akan mencegah seseorang untuk memuncak pada panjang kata sandi.Saya menemukan bug di shermy vanilla C # 3.5. Solusi NET yang berfungsi pesona. Saya juga telah memasukkan Damian Leszczyński - ide SecureString Vash di sini tetapi Anda dapat menggunakan string biasa jika Anda mau.
BUG: Jika Anda menekan spasi mundur saat prompt kata sandi dan panjang kata sandi saat ini adalah 0 maka tanda bintang tidak dimasukkan dengan benar di dalam topeng kata sandi. Untuk memperbaiki bug ini, modifikasi metode berikut.
sumber
Berikut adalah versi yang menambahkan dukungan untuk
Escape
kunci (yang mengembalikannull
string)sumber
Paket nuget (saya) untuk melakukan ini, berdasarkan jawaban teratas:
install-package PanoramicData.ConsoleExtensions
Pemakaian:
URL Proyek: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Permintaan tarik diterima.
sumber
Anda dapat menambahkan kunci Anda ke daftar yang tertaut.
Ketika kunci backspace diterima, hapus kunci terakhir dari daftar.
Ketika Anda menerima kunci enter, runtuh daftar Anda menjadi string dan lakukan sisa pekerjaan Anda.
sumber
Saya membuat beberapa perubahan untuk backspace
sumber
Ini adalah versi sederhana saya. Setiap kali Anda menekan tombol, hapus semua dari konsol dan gambar '*' sebanyak panjang string kata sandi.
sumber
Saya telah memperbarui versi Ronnie setelah menghabiskan terlalu banyak waktu mencoba memasukkan kata sandi hanya untuk mengetahui bahwa saya telah mengaktifkan CAPS LOCK!
Dengan versi ini, pesan apa pun yang ada
_CapsLockMessage
akan "mengambang" di akhir area pengetikan dan akan ditampilkan dengan warna merah.Versi ini membutuhkan sedikit lebih banyak kode dan membutuhkan loop polling. Di komputer saya penggunaan CPU sekitar 3% hingga 4%, tetapi orang selalu bisa menambahkan nilai Sleep () kecil untuk mengurangi penggunaan CPU jika diperlukan.
sumber
Jika saya memahami ini dengan benar, Anda mencoba membuat backspace menghapus karakter * yang terlihat di layar dan karakter yang di-cache dalam variabel pass Anda?
Jika demikian, maka ubah saja blok Anda yang lain untuk ini:
sumber
sumber