我花了一整天的时间来解决这个令人难以置信的Windows 10命令提示功能,这让我觉得我的控制台应用程序代码出了问题.我希望它能帮助别人.
问题:我的控制台应用程序似乎随机停止运行.到底是怎么回事?
我有一个控制台程序,其中包含不同的组件,如下所示:
void start() {
while(true){
DoSomething();
Thread.Sleep(1000*5);
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要入口点看起来像[伪代码]
Thread.Start(Componenet1.Start);
Thread.Start(Componenet2.Start);
while(true){
Console.Writeline("running");
Thread.Sleep(1000*5);
}
Run Code Online (Sandbox Code Playgroud)
在任何地方都没有Console.Reads.我的问题是SOMETIMES应用程序将运行良好,但然后停止,如果我按下窗口上的任何键它将再次开始工作.这种情况很少发生,但我在100+ VM上部署了这个程序,在自动化环境中全天候运行.
另外在电脑上我有一些AHK脚本和其他操纵鼠标的东西,但不确定它是否与它有任何关系.
另请注意,有时CPU可以在机器上以100%的速度运行,因此可能是线程优先级问题?
SOLUTION:您需要禁用快速编辑模式.这是使用C#代码执行此操作:
// http://msdn.microsoft.com/en-us/library/ms686033(VS.85).aspx
[DllImport("kernel32.dll")]
public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
private const uint ENABLE_EXTENDED_FLAGS = 0x0080;
static void Main(string[] args)
{
IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
SetConsoleMode(handle, ENABLE_EXTENDED_FLAGS);
Run Code Online (Sandbox Code Playgroud) 我最近在天文台的一台重要机器上从Windows XP升级到Windows 10(我早就应该这么做了,我知道......).我注意到在Windows 10中,如果我在Windows命令行(cmd.exe)上运行脚本,我现在可以通过单击终端窗口来中断脚本的运行.
当我点击终端时,标题栏会发生变化,并且标题前面会出现"select"字样.我现在已经多次意外地做了这件事(当重新组织打开的终端时)并且由于一个重要的运行脚本被中断而导致了一连串的错误,并且依赖它的一些事情已经下降了.
通过点击终端中的返回可以取消选择"选择"模式,然后中断的代码继续像以前一样运行.
我想尽可能禁用此功能.有没有遇到过这个?谢谢
我有一个控制台应用程序,无需用户交互即可执行我的代码.如果用户在控制台窗口内有意或无意地点击,则所有执行都将停止.
这与从控制台窗口复制文本有关.应用程序再次开始执行的唯一方法是,如果用户选择文本,然后右键单击控制台窗口,将其复制到剪贴板.
要查看此操作,请创建一个控制台应用程序并添加以下代码.
class Program
{
static void Main(string[] args)
{
var task = Task.Run(async () =>
{
int i = 0;
while (true)
{
Console.WriteLine(i++);
await Task.Delay(1000);
}
});
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
单击控制台窗口时,任务线程停止执行.这根本不是理想的行为,我想在我的控制台应用程序中防止这种情况发生.
我怎么能阻止这个?据我所知,控制台窗口上的所有属性/事件都与控制此行为无关.
有时当我执行上述语句时,程序会在控制台应用程序中冻结.如果我休息,我不能移动到下一行.我需要重置缓冲区吗?
这是一个批处理应用程序,它向屏幕显示消息.有没有人经历过这个并设法解决它.这似乎是一件新鲜事.我正在使用Visual Studio 2017教授版.
WriteLine档位在下面的功能.值为sMessage空白"".
static void Display(string sMessage, DisplayColours eColour = DisplayColours.White)
{
if (eColour == DisplayColours.Yellow)
Console.ForegroundColor = ConsoleColor.Yellow;
if (eColour == DisplayColours.Blue)
Console.ForegroundColor = ConsoleColor.Cyan;
if (eColour == DisplayColours.Green)
Console.ForegroundColor = ConsoleColor.Green;
if (eColour == DisplayColours.Red)
Console.ForegroundColor = ConsoleColor.Red;
if (eColour == DisplayColours.Magenta)
Console.ForegroundColor = ConsoleColor.Magenta;
if (oFptr != null)
{
oFptr.WriteLine(sMessage);
oFptr.Flush();
}
Console.WriteLine(sMessage);
Console.ForegroundColor = ConsoleColor.White;
}
Run Code Online (Sandbox Code Playgroud) 有谁知道如何从 powershell 脚本中禁用快速编辑模式?这个问题的“答案”不是答案:
(虽然可以通过编程方式设置注册表设置,但这样做不会影响当前会话)。
我查看了$host、$host.UI和$host.UI.RawUI对象,但找不到任何相关内容。
为了让事情更清楚一点,我不想更改注册表。特别是,我不想更改默认行为。事实上,只有一个脚本,而且实际上只有一个脚本分支,我需要在其中禁用快速编辑。所以我需要能够以编程方式禁用它。或者至少,能够使用命令行选项启动 powershell 以禁用快速编辑。
谢谢。
我将消息记录到控制台。但我有一些有趣的效果。当我在控制台中选择一些消息时,我的 UI 挂起。当我在控制台中取消选择所有内容时,UI 将处于活动状态。我不喜欢这种行为。
有什么解决办法吗?
Console::WriteLine("Message");
Run Code Online (Sandbox Code Playgroud) c# ×3
.net ×1
automation ×1
c++-cli ×1
command-line ×1
console ×1
freeze ×1
powershell ×1
windows ×1
windows-10 ×1