我想读取密码(文本)输入,同时在用户在控制台应用程序 C# 中键入时保持“CapsLock = true/false”读数最新
用户正在输入
显示大写锁定打开/关闭
是否需要使用线程?
感谢观看,感谢回答,感谢帮助我的人.. ty
这很奇怪,但有可能。
第一个问题是控制台不会让你写东西,直到用户完成他的输入。因此,您将无法“即时”处理 CapsLock 按键并通知用户其状态更改。即使来自单独的线程。 但您可以使用
PresentationCore.dll
或 System.Windows.Forms.dll
中的 MessageBox 并独立显示它。
第二个问题是您无法将 CapsLock 按下作为某种 KeyPress 事件正确处理。所以你需要手动检查并检测其状态变化。
我已经用这个例子解决了问题:
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
// ...
private static string PromptUserPassword()
{
// Flag to stop CapsLock state checks after user input
var passwordInputted = false;
// Run CapsLock state checks loop somewhere in background
Task.Run(async () =>
{
// "Remember" current CapsLock state
var capsLockLastState = Console.CapsLock;
while (!passwordInputted)
{
// When CapsLock state changed - notify about that with MessageBox and "remember" new state
if (Console.CapsLock != capsLockLastState)
{
capsLockLastState = Console.CapsLock;
MessageBox.Show($"CapsLock is turned {(Console.CapsLock ? "ON" : "OFF")}");
}
await Task.Delay(10);
}
});
// Ask user password
Console.WriteLine("Please, input your password:");
var password = Console.ReadLine();
// "Break" CapsLock state checks loop
passwordInputted = true;
return password;
}
从代码中需要调用的地方只需调用
var password = PromptUserPassword();
此代码有很多细微差别,例如您可以“忽略”显示的 MessageBox 并继续切换 CapsLock,然后接收大量 MessageBox。
提供的示例仅适用于 熟悉。我强烈建议不要在真正的授权目的中使用它,并且可能至少迁移到 WPF 或 WindowsForms 以获得正确的实现。
哦非常niiiiiiiiice谢谢你“Auditive” 我对您的代码做了一些更改,我认为这对控制台应用程序更好 但它有一个小问题......你能解决它吗?谢谢
using System;
using System.Threading.Tasks;
namespace ConsoleApplication290
{
class Program
{
static void Main(string[] args)
{
var password = PromptUserPassword();
}
private static string PromptUserPassword()
{
var passwordInputted = false;
Task.Run(async () =>
{
var capsLockLastState = Console.CapsLock;
while (!passwordInputted)
{
if (Console.CapsLock != capsLockLastState)
{
capsLockLastState = Console.CapsLock;
//myChange
int origRow = Console.CursorTop; int origCol = Console.CursorLeft;
Console.SetCursorPosition(60, 23);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("CapsLock = " + (Console.CapsLock));
Console.ForegroundColor = ConsoleColor.Gray;
Console.SetCursorPosition(origCol, origRow);
//myChange
string A = Console.ReadLine();
Console.WriteLine(A);
}
await Task.Delay(10);
}
});
Console.WriteLine("Please, input your password:");
var password = Console.ReadLine();
passwordInputted = true;
return password;
}
}
}