同时运行两个代码

问题描述 投票:0回答:2

我想读取密码(文本)输入,同时在用户在控制台应用程序 C# 中键入时保持“CapsLock = true/false”读数最新

用户正在输入
显示大写锁定打开/关闭

是否需要使用线程?

感谢观看,感谢回答,感谢帮助我的人.. ty

c# multithreading console capslock
2个回答
0
投票

这很奇怪,但有可能。

第一个问题是控制台不会让你写东西,直到用户完成他的输入。因此,您将无法“即时”处理 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 以获得正确的实现。


0
投票

哦非常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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.