我有一个包含很多线程的控制台应用程序.有些线程可以监视某些条件,如果它们是真的则终止程序.这种终止可以随时发生.
我需要一个可以在程序关闭时触发的事件,以便我可以清理所有其他线程并正确关闭所有文件句柄和连接.我不确定.NET框架中是否已经内置了一个,所以我在编写自己的框架之前就已经问过了.
我想知道是否有一个事件:
MyConsoleProgram.OnExit += CleanupBeforeExit;
Run Code Online (Sandbox Code Playgroud) 我有一个控制台应用程序,用于SetConsoleCtrlHandler设置处理和处理的处理程序CTRL_CLOSE_EVENT.处理程序简单的返回TRUE,这将导致一个对话框出现,并提示用户继续关闭或取消.
该软件在Windows XP SP3和Windows Web Server 2008 SP2上运行.
在XP中,当单击控制台窗口中的"X"时,我的控制处理程序被调用,并预期会出现提示.在Server 2008上关闭控制台窗口不会调用我的控制处理程序,应用程序将关闭而不会提示.
要检查控制处理程序是否正确设置,我已添加了一个案例CTRL_C_EVENT.我可以看到为Ctrl-C调用代码.
Server 2008中处理关闭事件的方式有什么不同吗?好像他们根本没有通过ctrl处理程序.
编辑:看一下MSDN页面SetConsoleCtrlHandler约我无法找到任何信息CTRL_CLOSE_EVENT不再在Vista和更高版本正在处理.
如果你正在使用Windows处理(HWND),而不是控制台CTRL事件,是有可能得到发送到控制台窗口中的关闭消息,并处理这个问题?
我有一个标准的Windows窗体应用程序,我需要一个解决方案来打开Windows窗体应用程序设置中的控制台.我想出了这个解决方案:
Public Class Win32
<DllImport("kernel32.dll")>
Public Shared Function AllocConsole() As Boolean
End Function
<DllImport("kernel32.dll")>
Public Shared Function FreeConsole() As Boolean
End Function
' ...
Win32.AllocConsole()
Console.WriteLine("Test")
Run Code Online (Sandbox Code Playgroud)
使用上面的P/Invoke函数,我可以打开一个控制台,而我的应用程序不是"控制台应用程序".
我现在遇到的问题是,当我关闭控制台窗口时,它退出我的程序并关闭所有窗体和Windows.有没有办法阻止用户关闭控制台窗口,或者在控制台窗口关闭时阻止程序退出?(我可以使用以编程方式关闭控制台Win32.FreeConsole().)
我用来AllocConsole()在winform应用程序中打开一个控制台.
如何在控制台关闭时阻止应用程序退出?
编辑
我不希望在控制台中显示完成百分比的更新
void bkpDBFull_PercentComplete(object sender, PercentCompleteEventArgs e)
{
AllocConsole();
Console.Clear();
Console.WriteLine("Percent completed: {0}%.", e.Percent);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用richtextBox作为替代方案
s =(e.Percent.ToString());
richTextBox1.Clear();
richTextBox1.AppendText("Percent completed: " +s +"%");
Run Code Online (Sandbox Code Playgroud)
但我无法及时看到完成百分比更新.它仅在100%完成时出现.
还有其他选择
在我的 WPF 应用程序中,我使用控制台窗口作为调试/消息窗口 - 我有选项设置来根据用户的需要显示和隐藏窗口,一切都很好。唯一的问题是,当用户关闭控制台窗口时,它会退出整个程序。如何覆盖它,以便当用户单击 X 时它只是隐藏控制台而不是退出应用程序?
这是我到目前为止:
const int SW_HIDE = 0;
const int SW_SHOW = 5;
public static bool ConsoleVisible { get; private set; }
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public static void HideConsole()
{
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
ConsoleVisible = false;
}
public static void ShowConsole()
{
var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
ConsoleVisible = true;
}
Run Code Online (Sandbox Code Playgroud)
** 对于想要使用它的人,您需要: using System.Runtime.InteropServices;
此代码源自此答案:https : //stackoverflow.com/a/3571628/649382
** 编辑 …
我用谷歌搜索,发现Console.CancelKeyPress哪些是有用的,但很多次我通过关闭窗口关闭我的控制台.使用右上角的X. Console.CancelKeyPress检测到ctrl + c,如何通过点击X来检测关闭?