- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否可以在 c# .net 控制台中暂停、缓存和刷新键盘输入。例如,假设我创建了一个线程来设置控制台光标位置,写入字符以绘制进度条的板(ANSI 字符),并且随着后台任务完成百分比的变化,线程再次更改光标位置以添加进度条中的另一个条,光标变回原来的位置。在发生这种情况的同时,我想要原始线程来处理 Console.ReadLine();我想知道我是否可以暂停、缓存和刷新键盘输入,或者是否有一种方法可以支持双向输入输出而没有副作用。这是一个示例:您会注意到,如果您按住该键,它会向上移动。
public void DrawScreenBackground()
{
List<ConsoleColor> ColourArray = new List<ConsoleColor>();
//ColourArray.Add(ConsoleColor.Black);
ColourArray.Add(ConsoleColor.DarkGray);
ColourArray.Add(ConsoleColor.DarkGreen);
ColourArray.Add(ConsoleColor.Green);
ColourArray.Add(ConsoleColor.Green);
ColourArray.Add(ConsoleColor.DarkGreen);
ColourArray.Add(ConsoleColor.DarkGray);
int minProgress = 0;
int maxProgress = 20;
int currentProgress = minProgress;
bool reverse = false;
while (1 == 1)
{
if (!reverse)
{
if (currentProgress == maxProgress)
reverse = !reverse;
else
currentProgress += 1;
}
else
{
if (currentProgress == minProgress)
reverse = !reverse;
else
currentProgress -= 1;
}
//draw/////
int curLeft = Console.CursorLeft;
int curTop = Console.CursorTop;
ConsoleColor defaultColor = Console.ForegroundColor;
ConsoleColor item = ColourArray[0];
ColourArray.RemoveAt(0);
ColourArray.Insert(ColourArray.Count-1, item);
DrawDoubleBorder(9, 9, 21, 2);
Console.ForegroundColor = item;
Console.SetCursorPosition(10, 10);
for (int i = 0; i < maxProgress - minProgress; i += 1)
Console.Write(" ");
Console.SetCursorPosition(10, 10);
for (int i = 0; i < currentProgress - minProgress; i += 1)
Console.Write("#");
Console.ForegroundColor = defaultColor;
Console.SetCursorPosition(curLeft, curTop);
///////////
Thread.Sleep(125);
}
}
private void DrawDoubleBorder(int x, int y, int width, int height)
{
Console.SetCursorPosition(x, y);
int currentX = x;
int currentY = y;
for (int h = 0; h <= height; h += 1)
{
for (int w = 0; w <= width; w += 1)
{
if (w == 0 && h == 0)
Console.Write(ConsoleChars.DoubleBorderTopLeft);
else if (w == width && h == height)
Console.Write(ConsoleChars.DoubleBorderBottomRight);
else if (w == width && h == 0)
Console.Write(ConsoleChars.DoubleBorderTopRight);
else if (w == 0 && h == height)
Console.Write(ConsoleChars.DoubleBorderBottomLeft);
else if (w == 0 || w == width)
Console.Write(ConsoleChars.DoubleBorderVerticle);
else if (h == 0 || h == height)
Console.Write(ConsoleChars.DoubleBorderHorizontal);
else
Console.Write(" ");
}
currentY += 1;
Console.SetCursorPosition(currentX, currentY);
}
}
public struct ConsoleChars
{
public static char DoubleBorderHorizontal = (char)205;
public static char DoubleBorderVerticle = (char)186;
public static char DoubleBorderBottomLeft = (char)200;
public static char DoubleBorderTopRight = (char)187;
public static char DoubleBorderBottomRight = (char)188;
public static char DoubleBorderFourWaySplit = (char)206;
public static char DoubleBorderTopLeft = (char)201;
public static char DoubleBorderLeftThreeWaySplit = (char)204;
public static char DoubleBorderRightThreeWaySplit = (char)185;
}
Thread thread = new Thread(new ThreadStart(DrawScreenBackground));
thread.Start();
Console.ReadLine();
编辑:解决方案 =
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
public class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.GetEncoding(1252);
Thread thread = new Thread(new ParameterizedThreadStart(DrawScreenBackground));
object locker = new object();
thread.Start(locker);
string input = string.Empty;
while(!input.Contains("\r\n"))
{
string temp = FlushKeyBoardInput();
if(temp!=string.Empty)
{
lock(locker)
{
Console.Write(temp);
input+=temp;
}
}
}
}
public static string FlushKeyBoardInput()
{
string output = string.Empty;
while (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey(true);
output += key.KeyChar;
}
return output;
}
public static void DrawScreenBackground(object locker)
{
List<ConsoleColor> ColourArray = new List<ConsoleColor>();
//ColourArray.Add(ConsoleColor.Black);
ColourArray.Add(ConsoleColor.DarkGray);
ColourArray.Add(ConsoleColor.DarkGreen);
ColourArray.Add(ConsoleColor.Green);
ColourArray.Add(ConsoleColor.Green);
ColourArray.Add(ConsoleColor.DarkGreen);
ColourArray.Add(ConsoleColor.DarkGray);
int minProgress = 0;
int maxProgress = 20;
int currentProgress = minProgress;
bool reverse = false;
while (1 == 1)
{
if (!reverse)
{
if (currentProgress == maxProgress)
reverse = !reverse;
else
currentProgress += 1;
}
else
{
if (currentProgress == minProgress)
reverse = !reverse;
else
currentProgress -= 1;
}
//draw/////
lock (locker)
{
int curLeft = Console.CursorLeft;
int curTop = Console.CursorTop;
ConsoleColor defaultColor = Console.ForegroundColor;
ConsoleColor item = ColourArray[0];
ColourArray.RemoveAt(0);
ColourArray.Insert(ColourArray.Count - 1, item);
DrawDoubleBorder(9, 9, 21, 2);
Console.ForegroundColor = item;
Console.SetCursorPosition(10, 10);
for (int i = 0; i < maxProgress - minProgress; i += 1)
Console.Write(" ");
Console.SetCursorPosition(10, 10);
for (int i = 0; i < currentProgress - minProgress; i += 1)
Console.Write("#");
Console.ForegroundColor = defaultColor;
Console.SetCursorPosition(curLeft, curTop);
///////////
}
Thread.Sleep(50);
}
}
public static void DrawDoubleBorder(int x, int y, int width, int height)
{
Console.SetCursorPosition(x, y);
int currentX = x;
int currentY = y;
for (int h = 0; h <= height; h += 1)
{
for (int w = 0; w <= width; w += 1)
{
if (w == 0 && h == 0)
Console.Write(ConsoleChars.DoubleBorderTopLeft);
else if (w == width && h == height)
Console.Write(ConsoleChars.DoubleBorderBottomRight);
else if (w == width && h == 0)
Console.Write(ConsoleChars.DoubleBorderTopRight);
else if (w == 0 && h == height)
Console.Write(ConsoleChars.DoubleBorderBottomLeft);
else if (w == 0 || w == width)
Console.Write(ConsoleChars.DoubleBorderVerticle);
else if (h == 0 || h == height)
Console.Write(ConsoleChars.DoubleBorderHorizontal);
else
Console.Write(" ");
}
currentY += 1;
Console.SetCursorPosition(currentX, currentY);
}
}
public struct ConsoleChars
{
public static char DoubleBorderHorizontal = (char)205;
public static char DoubleBorderVerticle = (char)186;
public static char DoubleBorderBottomLeft = (char)200;
public static char DoubleBorderTopRight = (char)187;
public static char DoubleBorderBottomRight = (char)188;
public static char DoubleBorderFourWaySplit = (char)206;
public static char DoubleBorderTopLeft = (char)201;
public static char DoubleBorderLeftThreeWaySplit = (char)204;
public static char DoubleBorderRightThreeWaySplit = (char)185;
}
}
}
注意:不支持退格,自己画一个光标可能会更好
最佳答案
不要使用 Console.ReadLine()
或 Console.Read()
。相反,看看 Console.ReadKey()
和 Console.KeyAvailable()
刷新键盘队列非常简单:
public void FlushKeyBoardInput()
{
while ( Console.KeyAvailable )
{
ConsoleKeyInfo key = Console.ReadKey() ;
}
}
Console.ReadKey()
甚至有一个重载,可让您控制是否将键回显到屏幕。
就暂停或缓存键盘输入而言,命令 shell 本身有一定数量的键盘缓冲区,但您希望将按键输入队列而不将它们作为缓存回显到屏幕,并将您的输入方法写入在从实际键盘中拉出之前从缓存中读取。
关于c# - 可以在 c#.net 控制台中暂停、缓存、刷新键盘输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541290/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!